#java #docker #intellij-idea #dockerfile
Вопрос:
У меня есть проект Java, который я сделал на IntelliJ. Структура файла, которая просто задана IntelliJ по умолчанию, выглядит следующим образом:
Я хочу создать образ докера для всего проекта (основной класс принимает входные данные из driver-info.txt файл в корневой папке) и переместите его в Docker Hub.
Я создал файл Dockerfile без расширения файла в корневой папке, и внутри него я вставил (это взято непосредственно из моего материала курса):
FROM openjdk:11
WORKDIR /app
COPY . /app
RUN javac *.java
CMD java Main
Затем я зашел в командный терминал и на компакт-диске в корневой каталог этого проекта (т. Е. C:UsersUser-PCIdeaProjectsTask_11_Capstone>). Там я набрал (также непосредственно вставленный из моего материала курса):
docker build -t java-app ./
Он строит шаги 1 и 2, но выдает ошибку на шаге 3, говоря:
=> ERROR [4/4] RUN javac *.java 0.4s
------
> [4/4] RUN javac *.java:
#8 0.363 error: file not found: *.java
#8 0.363 Usage: javac <options> <source files>
#8 0.363 use --help for a list of possible options
------
executor failed running [/bin/sh -c javac *.java]: exit code: 2
Я считаю, что существует проблема с поиском Докером моих файлов java в папке src/com/company (см. Изображение, которым я поделился относительно структуры файлов проекта). Я попытался изменить имя пути и попытался использовать полное имя, основанное на других статьях о StackOverflow. Но все они выдают мне одно и то же сообщение об ошибке.
Я также попытался найти файл Dockerfile в папке src/com.company рядом с другими классами. Но затем он преобразует инструкцию Dockerfile «КОПИРОВАТЬ», чтобы сказать COPY ../../.. /app
. Что я считаю правильным, потому что я действительно хочу скопировать все элементы, включая файлы .txt в корневой папке, в свое изображение.
Затем я помещаю компакт-диск в папку, в которой сейчас находится файл Dockerfile (т. Е. C:UsersUser-PCIdeaProjectsTask_11_Capstonesrccomcompany) для создания образа. Правильно ли это или мне следует оставаться в корневой папке проекта? Во всяком случае, выполнение этого таким образом позволяет мне успешно создавать образ. (Я думаю — это то, что это показывает).
Однако, когда приходит время запускать изображение, я снова застреваю. Я набираю следующее в командной строке (взято непосредственно из моего материала курса):
docker run java-app
И это дает мне это сообщение об ошибке:
Error: Could not find or load main class Main
Caused by: java.lang.NoClassDefFoundError: com/company/Main (wrong name: Main)
Другими словами, если я помещу файл Dockerfile прямо туда, где находятся файлы java, он все равно не сможет их найти.
Я попробовал форум Docker Hub, Stackoverflow, получил более 10 писем с поддержкой IntelliJ и сделал скриншот с моим наставником по курсу, мы просто не можем понять, почему он не запускается. Я также удалил Docker и переустановил его, а также создал версию своего проекта без пакета com.company.
Кроме того, мне успешно удалось создать, запустить и продвинуть другие образы Docker, в частности веб-сайт и простую программу на Java. Однако только при попытке сделать это в моем проекте в IntelliJ у меня возникают эти проблемы. Возможно, стоит отметить, что это также репозиторий Git, подключенный к GitHub.
Есть идеи, что я мог бы попробовать дальше?
Комментарии:
1. Я думаю, что вы все путаете, и вам не хватает некоторых основ. Вы должны понимать, что такое пакеты для xample, и это
com.company.Main
нечто иное, чем именованный классMain
. Это также означает, что вы не понимаете, что такое путь к классу. Итак, для меня это звучит так, как будто вы должны сначала изучить все такие основы java, прежде чем добавлять эту дополнительную сложность образа docker.2. у вас действительно есть файл с именем * ? javac *.java ищет файл с именем *.java, а не «все файлы с расширением .java».
3. Другая часть: любой реалистичный проект в реальном мире должен быть построен просто с использованием
javac *.java
… вы бы предпочли использовать такой инструмент, как gradle или maven. И такие инструменты часто поддерживают превращение доставок в образы докеров, просто говоря. Вы пытаетесь изобрести колеса здесь …4. И обратите внимание: если вы придерживаетесь своего подхода, сначала сделайте это без докера. Значение: просто напишите сценарий оболочки для запуска javac и запустите свой код. Как уже было сказано: вы уже неправильно поняли ЭТИ основные вещи из командной строки. Нет смысла спрашивать «как мне жонглировать во время езды на велосипеде» … когда уже одно только жонглирование доставляет вам неприятности.
5. Привет @Stultuske о, я вижу, я думал, что использование * похоже на заполнитель для всех . файлы java. У меня есть около 5 файлов с расширениями .java, но все они имеют разные имена. Должны ли они быть перечислены один за другим при компиляции?
Ответ №1:
Попробуйте изменить команду RUN и CMD в файле Dockerfile на
RUN javac com/comapny/*.java
CMD java -cp . com.company.Main
Я предполагаю, что основное находится под пакетом com.company