web-dev-qa-db-ja.com

カスタムマニフェストファイルを含むjarとして、プロジェクトクラスとプロジェクトの依存関係を含む「uber」jarを作成することはできますか?

プロジェクトクラスを含む実行可能なjar(mavenを使用)を作成しようとしています。メインクラスのエントリと、jarのルートにパックされた依存関係を指すクラスパスエントリを持つマニフェストファイルとの依存関係です。 ;このようなもの :

マニフェストファイル:

 ..... 
メインクラス:com.acme.MainClass 
クラスパス:dependecy1.jardependecy2.jar 
 ..... 

瓶:

 jar-root 
 | -.... 
 | -com/acme/../*.class
|-dependecy1.jar
 `--dependecy2.jar 

Maven-jar-pluginを使用してマニフェストファイルを作成し、maven-shade-pluginを使用して「uber」jarを作成していますが、依存関係が解凍され、クラスとしてjarに追加されます。

28

実際、maven 2にはmegajarまたはuberjarを作成するためのすべてが組み込まれているため、maven-shade-pluginが正確に(または他のプラグインで)何をしているのかを確認しませんでした。事前定義されたjar-with-dependencies記述子を指定してmaven-Assembly-pluginを使用する必要があります。

このスニペットをpom.xmlに追加するだけで、マニフェストをカスタマイズできます。

<plugin>
  <groupId>org.Apache.maven.plugins</groupId>
  <artifactId>maven-Assembly-plugin</artifactId>
  <configuration>
    <archive>
      <manifest>
        <mainClass>my.package.to.my.MainClass</mainClass>
      </manifest>
    </archive>
  </configuration>
</plugin>

そして、次のコマンドはあなたのuberjarを生成します:

mvn Assembly:assembly -DdescriptorId=jar-with-dependencies

ただし、この記述子のデフォルトの動作は、依存関係を解凍することです(maven-shade-pluginなど)。正直なところ、これが問題になる理由はわかりませんが、これが本当に必要なものでない場合は、独自のカスタムアセンブリ記述子を使用できます。

これを行うには、最初に、次の内容でsrc/Assembly/uberjar.xmlなどのアセンブリ記述子を作成します。

<Assembly>
  <id>uberjar</id>
  <formats>
    <format>jar</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <dependencySet>
      <unpack>false</unpack>
      <scope>runtime</scope>
      <useProjectArtifact>false</useProjectArtifact>
    </dependencySet>
  </dependencySets>
  <fileSets>
    <fileSet>
      <directory>${project.build.outputDirectory}</directory>
      <outputDirectory>/</outputDirectory>
    </fileSet>
  </fileSets>
</Assembly>

次に、この記述子を使用し、マニフェストのClass-Pathエントリに依存関係を追加するようにmaven-Assembly-pluginを構成します。

<plugin>
  <groupId>org.Apache.maven.plugins</groupId>
  <artifactId>maven-Assembly-plugin</artifactId>
  <configuration>
    <descriptors> 
      <descriptor>src/Assembly/uberjar.xml</descriptor>
    </descriptors>
    <archive>
      <manifest>
        <mainClass>my.package.to.my.MainClass</mainClass>
        <addClasspath>true</addClasspath>
      </manifest>
    </archive>
  </configuration>
  <!--
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>single</goal>
      </goals>
    </execution>
  </executions>
  -->
</plugin>

最後にmvn Assembly:assemblyを実行して、uberjarを作成します。

必要に応じて、executions要素のコメントを解除して、packageフェーズでアセンブリプラグインをバインドします(通常のビルドの一部としてアセンブリを生成します)。

59
Pascal Thivent

OneJar には maven2プラグイン があります。

6
skaffman

私は過去にこれにFatJarを使用しました。 http://fjep.sourceforge.net/

私は比較的単純なアプリケーションを作成しました。クライアントは実行可能ファイルをダブルクリックして、それを機能させたいと考えていました。インストーラーや依存関係は問題外です。 Fatjarは、プロジェクトライブラリと参照ファイルをEclipseから数メガバイトの実行可能jarにバンドルしました。完璧。

2
Karl

私はこれを行う2つの製品を知っています:

  • 1つは「bigjar」と呼ばれますが、これは一般的すぎてGoogle検索で使用できません。私はそれを見つけることができませんでした。
  • もう1つは「onejar」と呼ばれます。それへのかなりの数の参照があり、それはあなたが必要なことをすることを主張します。

MavenアセンブリでOneJarを使用している人からの投稿は次のとおりです。

http://5341.com/list/55/498657.html

0
Carl Smotricz