Pergunta

Estou tentando gerar um frasco executável para um pequeno projeto doméstico chamado "LogManager" usando o Maven, assim: assim:

Como posso criar um frasco executável com dependências usando o maven?

Eu adicionei o trecho mostrado lá ao POM.XML, e RAN 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. Recebo um erro ao clicar duas vezes no primeiro frasco:

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

Um erro ligeiramente diferente quando cliquei duas vezes no jar-with-dependências.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 classe e verifiquei a ortografia no POM. Minha classe 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 será executado? Além disso, por que há dois frascos para começar? Deixe -me saber se precisar de mais informações.

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

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.gorkwobble</groupId>
  <artifactId>logmanager</artifactId>
  <name>LogManager</name>
  <version>0.1.0</version>
  <description>Systematically renames specified log files on a scheduled basis. Designed to help manage MUSHClient logging and prevent long, continuous log files.</description>
  <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.2</version>
            <!-- nothing here -->
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.2-beta-4</version>
            <configuration>
              <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
              </descriptorRefs>
              <archive>
                <manifest>
                  <mainClass>com.gorkwobble.logmanager.LogManager</mainClass>
                </manifest>
              </archive>
            </configuration>
            <executions>
              <execution>
                <phase>package</phase>
                <goals>
                  <goal>single</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
              <source>1.6</source>
              <target>1.6</target>
            </configuration>
          </plugin>
    </plugins>
  </build>
  <dependencies>
    <!-- commons-lang -->
    <dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>2.4</version>
    </dependency> 

    <!-- Quartz scheduler -->
    <dependency>
        <groupId>opensymphony</groupId>
        <artifactId>quartz</artifactId>
        <version>1.6.3</version>
    </dependency>
    <!-- Quartz 1.6.0 depends on commons collections -->
    <dependency>
      <groupId>commons-collections</groupId>
      <artifactId>commons-collections</artifactId>
      <version>3.1</version>
    </dependency>
    <!-- Quartz 1.6.0 depends on commons logging -->
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.1</version>
    </dependency>
    <!-- Quartz 1.6.0 requires JTA in non J2EE environments -->
    <dependency>
      <groupId>javax.transaction</groupId>
      <artifactId>jta</artifactId>
      <version>1.1</version>
      <scope>runtime</scope>
    </dependency>

    <!-- junitx test assertions -->
    <dependency>
        <groupId>junit-addons</groupId>
        <artifactId>junit-addons</artifactId>
        <version>1.4</version>
        <scope>test</scope>
    </dependency>

    <!-- junit dependency; FIXME: make this a separate POM -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.1</version>
    </dependency>

  </dependencies>
  <dependencyManagement>
  </dependencyManagement>
</project>
Foi útil?

Solução

Na verdade, acho que a resposta dada no pergunta Você mencionou que é apenas errado (Atualização - 20101106: Alguém consertou, isto resposta refere -se ao versão precedindo a edição) e isso explica, pelo menos parcialmente, por que você encontra 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 pote do módulo LogManager gerado durante o package fase por jar:jar (porque o módulo tem uma embalagem do tipo jar). O segundo é a assembléia gerada por assembly:assembly e deve conter as classes do módulo atual e suas dependências (se você usou o descritor jar-with-dependencies).

Recebo um erro ao clicar duas vezes no primeiro frasco:

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

Se você aplicou a configuração sugerida do link postada como referência, você configurou o plug -in JAR para produzir um artefato executável, algo assim:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
      <archive>
        <manifest>
          <addClasspath>true</addClasspath>
          <mainClass>com.gorkwobble.logmanager.LogManager</mainClass>
        </manifest>
      </archive>
    </configuration>
  </plugin>

Então logmanager-0.1.0.jar é realmente executável, mas 1. não é isso que você deseja (porque não tem todas as dependências) e 2. Não contém com.gorkwobble.logmanager.LogManager (É isso que o erro está dizendo, verifique o conteúdo do frasco).

Um erro ligeiramente diferente quando cliquei duas vezes no jar-with-dependências.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 montagem, conforme sugerido, você terá algo assim:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
    </configuration>
  </plugin>

Com esta configuração, logmanager-0.1.0-jar-with-dependencies.jar contém as classes do módulo atual e suas dependências, mas, de acordo com o erro, seu META-INF/MANIFEST.MF não conter a Main-Class entrada (provavelmente não é o mesmo manifesto.mf que no logManager-0.1.0.jar). O frasco é realmente não executável, o que novamente não é o que você deseja.


Então, minha sugestão seria remover o configuration elemento do maven-jar-plugin e para configurar a plugina do maven-montagem assim:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.2</version>
    <!-- nothing here -->
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2-beta-4</version>
    <configuration>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
      <archive>
        <manifest>
          <mainClass>org.sample.App</mainClass>
        </manifest>
      </archive>
    </configuration>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

Claro, substitua org.sample.App com a classe que você deseja executar. Pequeno bônus, eu vi assembly:single para o package fase para que você não tenha que correr assembly:assembly não mais. Apenas corra mvn install e a montagem será produzida durante a construção padrão.

Então, atualize seu pom.xml com a configuração fornecida acima e execute mvn clean install. Então, CD no target diretório e tente novamente:

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

Se você receber um erro, atualize sua pergunta com ela e poste o conteúdo do META-INF/MANIFEST.MF arquivo e parte relevante do seu pom.xml (As peças de configuração dos plugins). Além disso, poste o resultado de:

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

Demonstrar que está funcionando bem na linha de comando (independentemente do que o Eclipse está dizendo).

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

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
      <source>1.6</source>
      <target>1.6</target>
    </configuration>
  </plugin>

Outras dicas

A resposta de Pascal Thivent me ajudou também.Mas Se você gerenciar seus plugins dentro do <pluginManagement>Elemento, você deve definir a montagem novamente fora do gerenciamento de plug -in, ou então as dependências não estão embaladas no frasco se você correr mvn install.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>


    <build>
        <pluginManagement>
            <plugins>

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.1</version>
                    <configuration>
                        <source>1.6</source>
                        <target>1.6</target>
                    </configuration>
                </plugin>

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <version>2.4</version>
                    <configuration>
                        <archive>
                            <manifest>
                                <mainClass>main.App</mainClass>
                            </manifest>
                        </archive>
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                    </configuration>
                    <executions>
                        <execution>
                            <id>make-assembly</id>
                            <phase>package</phase>
                            <goals>
                                <goal>single</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>

            </plugins>

        </pluginManagement>

        <plugins> <!-- did NOT work without this  -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
            </plugin>
        </plugins>

    </build>


    <dependencies>
       <!--  dependencies commented out to shorten example -->
    </dependencies>

</project>

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

mvn package assembly:single

Aqui pacote é palavra -chave.

Clique com o botão direito do mouse no projeto e forneça o Maven Build, o Maven Clean, o Maven gera recursos e a instalação do Maven. O arquivo JAR gerará automaticamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top