Mavenで実行可能なjarを構築していますか?


122

次のように、mavenを使用して「logmanager」と呼ばれる小さなホームプロジェクトの実行可能jarを生成しようとしています。

Mavenを使用して、依存関係を持つ実行可能JARを作成するにはどうすればよいですか?

そこで表示されたスニペットをpom.xmlに追加し、mvn assembly:assemblyを実行しました。logmanager / targetに2つのjarファイル(logmanager-0.1.0.jarとlogmanager-0.1.0-jar-with-dependencies.jar)が生成されます。最初のjarをダブルクリックするとエラーが発生します。

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

jar-with-dependencies.jarをダブルクリックしたときの少し異なるエラー:

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

パスとクラス名をコピーして貼り付け、POMのスペルをチェックしました。私のメインクラスは、Eclipse起動構成から正常に起動します。誰かが私のjarファイルが実行されない理由を理解するのを手伝ってくれる?また、なぜ最初に2つのjarファイルがあるのですか?さらに情報が必要な場合はお知らせください。

pom.xml参考までに、以下が完全なです。

<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>

回答:


244

実は、私はで与えられた答えだと思う質問あなたが言及しただけであり、間違ったUPDATE - 20101106:誰かがそれを固定し、この答えはを参照、編集の前のバージョン)とあなたがトラブルに遭遇し、なぜこれは、少なくとも部分的に、説明しています。


logmanager / targetに2つのjarファイル(logmanager-0.1.0.jarとlogmanager-0.1.0-jar-with-dependencies.jar)が生成されます。

最初のものは、packageフェーズによって生成されたlogmanagerモジュールのJARですjar:jar(モジュールにはタイプのパッケージがあるためjar)。2つ目は、によって生成されたアセンブリでありassembly:assembly、現在のモジュールのクラスとその依存関係(記述子を使用した場合)を含む必要がありますjar-with-dependencies

最初のjarをダブルクリックするとエラーが発生します。

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

参照として投稿されたリンクの推奨構成を適用した場合、次のような実行可能なアーティファクトを生成するようにjarプラグインを構成しました。

  <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>

だから、logmanager-0.1.0.jar実際に実行可能であるが、1本は、それが含まれていないと2(それはすべての依存関係を持っていないため)あなたが望むものではありませんcom.gorkwobble.logmanager.LogManager(これはエラーがjarファイルの内容を確認し、言っていることです)。

jar-with-dependencies.jarをダブルクリックしたときの少し異なるエラー:

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

繰り返しになりますが、提案されているようにアセンブリプラグインを構成した場合は、次のようになります。

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

この設定でlogmanager-0.1.0-jar-with-dependencies.jarは、現在のモジュールその依存関係のクラスが含まれていますが、エラーによると、エントリMETA-INF/MANIFEST.MF 含まれていませんMain-Class(logmanager-0.1.0.jarと同じMANIFEST.MFとは異なる可能性があります)。jarは実際に実行可能ではありませんが、これも希望どおりではありません。


したがって、私の提案はconfiguration、maven-jar-pluginから要素を削除し、maven-assembly-pluginを次のように構成することです。

  <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>

もちろん、org.sample.App実行したいクラスに置き換えてください。少しボーナス、私はフェーズにバインドassembly:singleしたpackageので、assembly:assemblyもう走る必要はありません。実行するだけmvn installで、アセンブリは標準ビルド中に生成されます。

したがって、上記の設定でpom.xmlを更新して、を実行してくださいmvn clean install。次に、targetディレクトリにcdして、再試行します。

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

エラーが発生した場合は、それを使って質問を更新し、META-INF/MANIFEST.MFファイルの内容と関連する部分pom.xml(プラグイン構成部分)を投稿してください。また、結果を投稿してください:

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

コマンドラインで問題なく機能していることを示します(Eclipseの内容に関係なく)。

編集:Java 6の場合、maven-compiler-pluginを構成する必要があります。これを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>

4
コメントしてくれてありがとう!私はあなたが指定したようにpom.xmlを変更しました。mvn clean installを実行すると、コードから大量のコンパイルエラーが表示され、-source 1.3では注釈などがサポートされていません。私はjdk1.6を使用していますが、Eclipseでコンパイルされます。1.3がどのように導入されたかはわかりません。多分pomスニペットのライブラリバージョンの1つが古いバージョンですか?
RMorrisey 2009年

ありがとう!1.3の問題を乗り越えました。また、POMにjunit4依存関係を追加する必要がありました。私は他のもののトラブルシューティングに取り組んでいます。行き詰まったらまた投稿します!jarを実行している場合は、これを回答としてマークします。私の現在のPOMは上記の質問で更新されています。
RMorrisey 2009年

生成されたjarファイルからリソースを除外する方法はありますか?

2
結果のjarに「通常の」名前を付けることは可能ですか?
Daniil Shevelev、2014

1
また、この

15

Pascal Thiventの答えも私を助けてくれました。 ただし<pluginManagement>要素内でプラグインを管理する場合は、プラグイン管理の外部でアセンブリを再度定義する必要がありますmvn install。そうしないと、を実行しても依存関係がjarにパックされません。

<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>

1
マイクに感謝します、それは私を助けました。最初は、<pluginManagement>を使用せずにパッケージが生成されていました。しかし、Eclipseはpom.xmlで「maven-プラグインの実行がライフサイクルの対象外」というエラーを出していました。気が散る。これを解決するために<pluginManagement>を追加しました。これでEclipseエラーはなくなりましたが、パッケージのビルドが停止しました。上記のpomのスニペットがうまくいきました。:)
shashaDenovo 2015

2
これは便利でした。<pluginManagement>を使用しているときに、トップの回答が機能しません。
ininprsr 2015

5

パッケージでアセンブリの目標を実行したくない場合は、次のコマンドを使用できます。

mvn package assembly:single

ここでパッケージはキーワードです。


-1

プロジェクトを右クリックして、mavenビルド、maven clean、maven生成リソース、およびmavenインストールを指定します。jarファイルが自動的に生成されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.