28

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

マニフェスト ファイル:

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

ジャー:

jar ルート
|-- ....
|-- com/acme/../*.class
|--dependecy1.jar
`--依存性2.jar

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

4

4 に答える 4

61

実際、maven-shade-pluginmaven 2にはmegajarまたはuberjarを作成するためのすべてが組み込まれているため、正確に何が行われているのか(または他のプラグイン)は確認しませんでした。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(通常のビルドの一部としてアセンブリを生成します)。

于 2009-12-02T18:35:03.800 に答える
6

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

于 2009-12-02T22:50:46.447 に答える
2

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

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

于 2009-12-02T18:20:36.530 に答える