Eu tenho um JAR com 4 classes, cada uma tem o método Main. Eu quero ser capaz de executar cada um deles conforme a necessidade. Estou tentando executá-lo na linha de comando na caixa Linux.
E.g. The name of my JAR is MyJar.jar
Possui estrutura de diretórios para as principais classes da seguinte maneira:
com/mycomp/myproj/dir1/MainClass1.class
com/mycomp/myproj/dir2/MainClass2.class
com/mycomp/myproj/dir3/MainClass3.class
com/mycomp/myproj/dir4/MainClass4.class
Eu sei que posso especificar uma classe como principal no meu arquivo de manifesto. Mas existe alguma maneira pela qual eu possa especificar algum argumento na linha de comando para executar a classe que eu desejar executar?
Eu tentei isso:
jar cfe MyJar.jar com.mycomp.myproj.dir2.MainClass2 com/mycomp/myproj/dir2/MainClass2.class /home/myhome/datasource.properties /home/myhome/input.txt
E eu recebi este erro:
com/mycomp/myproj/dir2/MainClass2.class : no such file or directory
(No comando acima, '/home/myhome/datasource.properties' e '/home/myhome/input.txt' são os argumentos da linha de comando).
java
jar
executable-jar
Bhushan
fonte
fonte
Respostas:
Você pode criar seu jar sem a classe principal em seu arquivo de manifesto. Então :
fonte
Você pode executar qualquer classe que possua um
public final static main
método a partir de um arquivo JAR, mesmo que o arquivo jar tenha umMain-Class
definido .Executar classe principal:
Execute outra classe com um
public static void main
método:Nota: os primeiros usos
-jar
, os segundos usos-cp
.fonte
java -cp "./*" com.mycomp.myproj.AnotherClassWithMainMethod
as aspas duplas para./*
impedir que as máquinas unix o expandam. Observe também que"./*.jar"
não funcionará.Além de chamar
java -jar myjar.jar com.mycompany.Myclass
, você também pode tornar a classe principal em sua classe Manifest um Dispatcher.Exemplo:
fonte
Esta resposta é para usuários de inicialização Spring:
Se o seu JAR era de um
Spring-boot
projeto e criado usando o comandomvn package spring-boot:repackage
, o método "-cp" acima não funcionará. Você vai ter:mesmo se você puder ver a classe no JAR por
jar tvf yours.jar
.Nesse caso, execute sua classe alternativa pelo seguinte comando:
Pelo que entendi, a
org.springframework.boot.loader.PropertiesLauncher
classe Spring-boot serve como uma classe de entrada de despacho, e o-Dloader.main
parâmetro informa o que executar.Referência: https://github.com/spring-projects/spring-boot/issues/20404
fonte
Antes de tudo,
jar
cria um jar e não o executa. Tente emjava -jar
vez disso.Segundo, por que você passa na classe duas vezes, como FQCN (
com.mycomp.myproj.dir2.MainClass2
) e como arquivo (com/mycomp/myproj/dir2/MainClass2.class
)?Editar:
Parece que
java -jar
exige que uma classe principal seja especificada. Você poderia tentarjava -cp your.jar com.mycomp.myproj.dir2.MainClass2 ...
.-cp
define o jar no caminho de classe e permite que o java procure a classe principal lá.fonte
Outra opção semelhante que Nick mencionou brevemente nos comentários é criar vários frascos de invólucro. Eu não tentei, mas acho que eles poderiam estar completamente vazios, exceto o arquivo de manifesto, que deve especificar a classe principal a ser carregada, bem como a inclusão do MyJar.jar no caminho de classe.
MyJar 1 .jar \ META-INF \ MANIFEST.MF
MyJar 2 .jar \ META-INF \ MANIFEST.MF
etc. Em seguida, basta executá-lo com
java -jar MyJar2.jar
fonte
Adicione o plug-in abaixo ao seu arquivo pom.xml e especifique a classe principal com o nome completo no elemento.
fonte