У меня есть JAR с 4 классами, у каждого есть метод Main. Я хочу быть в состоянии управлять каждым из них согласно потребности. Я пытаюсь запустить его из командной строки на Linux box.
E.g. The name of my JAR is MyJar.jar
Он имеет структуру каталогов для основных классов следующим образом:
com/mycomp/myproj/dir1/MainClass1.class
com/mycomp/myproj/dir2/MainClass2.class
com/mycomp/myproj/dir3/MainClass3.class
com/mycomp/myproj/dir4/MainClass4.class
Я знаю, что могу указать один класс в качестве основного в моем файле манифеста. Но есть ли способ указать аргумент в командной строке для запуска любого класса, который я хочу запустить?
Я попробовал это:
jar cfe MyJar.jar com.mycomp.myproj.dir2.MainClass2 com/mycomp/myproj/dir2/MainClass2.class /home/myhome/datasource.properties /home/myhome/input.txt
И я получил эту ошибку:
com/mycomp/myproj/dir2/MainClass2.class : no such file or directory
(В приведенной выше команде аргументы командной строки - «/home/myhome/datasource.properties» и «/home/myhome/input.txt»).
java
jar
executable-jar
Бхушан
источник
источник
Ответы:
Вы можете создать свой кувшин без Main-Class в файле Manifest. Затем :
источник
Вы можете выполнить любой класс, у которого есть
public final static main
метод из файла JAR, даже если у файлаMain-Class
JAR есть определенный .Выполнить основной класс:
Выполните другой класс с помощью
public static void main
метода:Примечание: первый использует
-jar
, второй использует-cp
.источник
java -cp "./*" com.mycomp.myproj.AnotherClassWithMainMethod
двойные кавычки, чтобы не./*
допустить его расширения на машинах unix. Также обратите внимание, что"./*.jar"
не будет работать.Помимо вызова
java -jar myjar.jar com.mycompany.Myclass
, вы также можете сделать основной класс в вашем манифесте классом Dispatcher.Пример:
источник
Этот ответ для пользователей Spring-boot:
Если ваш JAR был из
Spring-boot
проекта и создан с помощью командыmvn package spring-boot:repackage
, описанный выше метод "-cp" не будет работать. Ты получишь:даже если вы можете увидеть класс в JAR
jar tvf yours.jar
.В этом случае запустите альтернативный класс с помощью следующей команды:
Как я понял,
org.springframework.boot.loader.PropertiesLauncher
класс Spring-boot служит диспетчерским входным классом, а-Dloader.main
параметр указывает ему, что запускать.Ссылка: https://github.com/spring-projects/spring-boot/issues/20404
источник
Прежде всего
jar
создает банку, а не запускает ее. Попробуйjava -jar
вместо этого.Во-вторых, почему вы передаете класс дважды, как FQCN (
com.mycomp.myproj.dir2.MainClass2
) и как file (com/mycomp/myproj/dir2/MainClass2.class
)?Редактировать:
Кажется, будто
java -jar
требуется указать главный класс. Вы можете попробоватьjava -cp your.jar com.mycomp.myproj.dir2.MainClass2 ...
вместо этого.-cp
устанавливает jar на путь к классам и позволяет java искать там основной класс.источник
Еще одна похожая опция, на которую, как мне кажется, Ник кратко упомянул в комментариях, - это создание нескольких jar-пакетов. Я не пробовал, но думаю, что они могут быть полностью пустыми, кроме файла манифеста, в котором должен быть указан основной класс для загрузки, а также включение MyJar.jar в путь к классам.
MyJar 1 .jar \ META-INF \ MANIFEST.MF
MyJar 2 .jar \ META-INF \ MANIFEST.MF
и т.д. Тогда просто запустите его с
java -jar MyJar2.jar
источник
Добавьте плагин ниже в ваш файл pom.xml и укажите основной класс с полным именем в элементе.
источник