Это не проблема Docker, это проблема Java. Есть несколько способов определить записи classpath для запуска исполняемого jar.
Подход Shaded или Uber jar
В этом случае вы должны создать затененный jar, содержащий все зависимые классы в одном исполняемом jar-файле. ,Maven имеет плагин под названием Apache Maven Shade Plugin для создания этого артефакта uber-jar.
Наконец, просто запустите:
java -jar shaded-artifact.jar
или в Docker
CMD ["java", "-jar", "shaded-artifact.jar"]
Подход classpath командной строки
Если созданный артефакт jar требует наличия других (зависимых) jar, вы должны указать classpath. В этом случае скопируйте все необходимые jar-файлы в папку, например lib и используйте следующую команду:
java -cp '<name-of-jar.jar>:<path-of-dependencies>' <fully.quialified.main.ClassName>
Как видите, подстановочный знак (*) и несколько элементов classpath допускаются разделенными:
*
java -cp 'Customer.jar:libs/*' com.mycompany.Customer
в Docker
CMD ["java", "-cp", "Customer.jar:libs/*", "com.mycompany.Customer"]
Classpath в подходе MANIFEST
После того, как вы собрали все эти зависимые артефакты в папку, вы просто добавляетеClass-Path
введите в META-INF / MANIFEST.MF файл, подобный следующему:
Class-Path: . lib/*
и запустите
java -jar Customer.jar
илив Docker
CMD ["java", "-jar", "Customer.jar"]
Какая из них самая лучшая, зависит от многих вещей, которые вы должны выбрать.
Редактировать:
Судя по обновленному вопросу, кажется, что uber jar был создан плагином сборки с использованием предопределенного дескриптора jar-with-dependencies . Это создаст другой файл jar, который будет помещен в целевую (выходную) папку, и его имя оканчивается на -jar-with-dependencies.jar
- Используйте этот jar внутри основного артефакта.
- Выполните двойную проверку, чтобы убедиться, что все записи
<mainClass>
указывают на существующий класс. Вы упомянули три разных основных класса в одном и том же вопросе. com.companyname.Customer
com.mycompany.Customer
com.company.customers.Customer
- Обратите внимание, что в Linux и Java учитывается регистр. Исходя из этого, имя класса должно быть точно
Customer
, а все имена папок должны быть строчными.
Надеюсь, это поможет.