Докер не может найти мои файлы .java в настройках проекта IntelliJ

#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