Construindo jar executável com maven?

Eu estou tentando gerar um jar executável para um projeto de pequena casa chamado “logmanager” usando maven, assim:

Como posso criar um JAR executável com dependencies usando o Maven?

Adicionei o snippet mostrado no pom.xml e executei o mvn assembly: assembly. Ele gera dois arquivos jar no logmanager / target: logmanager-0.1.0.jar e logmanager-0.1.0-jar-with-dependencies.jar. Eu recebo um erro quando clico duas vezes no primeiro flask:

Could not find the main class: com.gorkwobble.logmanager.LogManager. Program will exit. 

Um erro ligeiramente diferente quando clico duas vezes no jar-with-dependencies.jar:

 Failed to load Main-Class manifest attribute from: C:\EclipseProjects\logmanager\target\logmanager-0.1.0-jar-with-dependencies.jar 

Copiei e colei o caminho e o nome da class e verifiquei a ortografia no POM. Minha class principal é lançada bem a partir de uma configuração de lançamento do eclipse. Alguém pode me ajudar a descobrir por que meu arquivo jar não roda? Além disso, por que existem dois flasks para começar? Deixe-me saber se você precisar de mais informações.

Aqui está o pom.xml completo, para referência:

  4.0.0 com.gorkwobble logmanager LogManager 0.1.0 Systematically renames specified log files on a scheduled basis. Designed to help manage MUSHClient logging and prevent long, continuous log files.    org.apache.maven.plugins maven-jar-plugin 2.2    org.apache.maven.plugins maven-assembly-plugin 2.2-beta-4   jar-with-dependencies    com.gorkwobble.logmanager.LogManager      package  single      org.apache.maven.plugins maven-compiler-plugin  1.6 1.6        commons-lang commons-lang 2.4    opensymphony quartz 1.6.3    commons-collections commons-collections 3.1    commons-logging commons-logging 1.1    javax.transaction jta 1.1 runtime    junit-addons junit-addons 1.4 test    junit junit 4.1      

Na verdade, acho que a resposta dada na pergunta que você mencionou está errada ( UPDATE – 20101106: alguém corrigiu, essa resposta se refere à versão anterior à edição ) e isso explica, pelo menos parcialmente, por que você se depara com problemas.


Ele gera dois arquivos jar no logmanager / target: logmanager-0.1.0.jar e logmanager-0.1.0-jar-with-dependencies.jar.

O primeiro é o JAR do módulo logmanager gerado durante a fase de package por jar:jar (porque o módulo possui uma embalagem do tipo jar ). O segundo é o assembly gerado pelo assembly:assembly e deve conter as classs do módulo atual e suas dependencies (se você usou o descritor jar-with-dependencies ).

Eu recebo um erro quando clico duas vezes no primeiro flask:

 Could not find the main class: com.gorkwobble.logmanager.LogManager. Program will exit. 

Se você aplicou a configuração sugerida do link postado como referência, você configurou o plugin jar para produzir um artefato executável, algo assim:

   org.apache.maven.plugins maven-jar-plugin    true com.gorkwobble.logmanager.LogManager     

Portanto logmanager-0.1.0.jar é de fato executável mas 1. isto não é o que você quer (porque ele não tem todas as dependencies) e 2. ele não contém com.gorkwobble.logmanager.LogManager (isto é o que o erro está dizendo, verifique o conteúdo do jarro).

Um erro ligeiramente diferente quando clico duas vezes no jar-with-dependencies.jar:

 Failed to load Main-Class manifest attribute from: C:\EclipseProjects\logmanager\target\logmanager-0.1.0-jar-with-dependencies.jar 

Novamente, se você configurou o plug-in de assembly conforme sugerido, você tem algo assim:

   org.apache.maven.plugins maven-assembly-plugin   jar-with-dependencies    

Com essa configuração, o logmanager-0.1.0-jar-with-dependencies.jar contém as classs do módulo atual e suas dependencies, mas, de acordo com o erro, seu META-INF/MANIFEST.MF não contém um Main-Class input (provavelmente não é o mesmo MANIFEST.MF como no logmanager-0.1.0.jar). O jar não é realmente executável, o que novamente não é o que você quer.


Então, minha sugestão seria remover o elemento de configuration do maven-jar-plugin e configurar o maven-assembly-plugin assim:

   org.apache.maven.plugins maven-jar-plugin 2.2    org.apache.maven.plugins maven-assembly-plugin 2.2-beta-4   jar-with-dependencies    org.sample.App      package  single     

Obviamente, substitua org.sample.App pela class que você deseja executar. Pouco bônus, vinculei assembly:single à fase de package , para que você não precise mais executar assembly:assembly . Basta executar o mvn install e o assembly será produzido durante a compilation padrão.

Portanto, atualize seu pom.xml com a configuração fornecida acima e execute o mvn clean install . Em seguida, faça cd no diretório de target e tente novamente:

 java -jar logmanager-0.1.0-jar-with-dependencies.jar 

Se você receber um erro, atualize sua pergunta com ele e poste o conteúdo do arquivo META-INF/MANIFEST.MF e a parte relevante do seu pom.xml (as partes de configuração dos plug-ins). Também por favor poste o resultado de:

 java -cp logmanager-0.1.0-jar-with-dependencies.jar com.gorkwobble.logmanager.LogManager 

para demonstrar que está funcionando bem na linha de comando (independentemente do que o eclipse está dizendo).

EDIT: Para o Java 6, você precisa configurar o plugin do compilador-maven. Adicione isto ao seu pom.xml:

   org.apache.maven.plugins maven-compiler-plugin  1.6 1.6   

A resposta de Pascal Thivent ajudou-me também. Mas se você gerencia seus plugins dentro do elemento , você precisa definir o assembly novamente fora do gerenciamento de plugins, ou então as dependencies não serão empacotadas no jar se você executar o mvn install .

  4.0.0 1.0.0-SNAPSHOT jar     org.apache.maven.plugins maven-compiler-plugin 3.1  1.6 1.6    org.apache.maven.plugins maven-assembly-plugin 2.4    main.App    jar-with-dependencies     make-assembly package  single          org.apache.maven.plugins maven-assembly-plugin        

Se você não deseja executar meta de assembly no pacote, você pode usar o próximo comando:

 mvn package assembly:single 

Aqui o pacote é palavra-chave.

Clique com o botão direito do mouse no projeto e forneça o maven build, o maven clean, o maven generate resource e o maven install. O arquivo jar será gerado automaticamente.