npacked依存jarを含むクライアントjarを構築しようとしています。また、マニフェストには、依存するjarへのclass-path
エントリが必要です。以下のスニペットは機能しますが、jarファイルは解凍されています-jarファイルが解凍されないようにするにはどうすればよいですか?
<plugin>
<artifactId>maven-Assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-Assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
実際、jar-with-dependencies
を使用してアセンブルすると、対応するアセンブリ記述子で${Assembly.dependencySets.dependency.unpack}
がtrue
に設定されるため、mavenはすべての依存関係をアンパックします。
簡単な修正は、次のように、jar-with-dependencies.xml
に似たアセンブリ記述子を提供し、${Assembly.dependencySets.dependency.unpack}
をfalse
に変更することです。
EDIT:理由は不明ですが、<unpack>false</unpack>
を使用した場合の動作はまったく同じではなく、fileSetに<outputDirectory>/</outputDirectory>
を追加する必要があるようです。そうしないと、期待どおりの結果が得られません。結果。
<Assembly>
<id>uberjar</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<unpack>false</unpack>
<scope>runtime</scope>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<directory>${project.build.outputDirectory}</directory>
<outputDirectory>/</outputDirectory>
</fileSet>
</fileSets>
</Assembly>
依存関係をjarファイルとしてjarに追加できます。
Assembly-descriptor.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>
pom.xml
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-Assembly-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>make-uberjar</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptor>src/main/assemble/Assembly-descriptor.xml</descriptor>
</configuration>
</execution>
</executions>
</plugin>
ただし、残念ながら、Class-Path
でmanifest.mf
ヘッダーを使用することはできません。 JARファイルのクラスパスへのクラスの追加 を参照してください。
注:
Class-Path
ヘッダーは、JARファイル内のJARファイルやインターネット経由でアクセス可能なクラスではなく、ローカルネットワーク上のクラスまたはJARファイルを指します。プロトコル。 JARファイル内のJARファイルのクラスをクラスパスにロードするには、それらのクラスをロードするカスタムコードを作成する必要があります。たとえば、MyJar.jar
にMyUtils.jar
という別のJARファイルが含まれている場合、Class-Path
マニフェストのMyJar.jar's
ヘッダーを使用して、MyUtils.jar
のクラスをクラスパスにロードすることはできません。 。
Pascal Thiventによって提案されたソリューションは、Mavenアセンブリプラグインの新しいアセンブリを定義します。 Mavenアセンブリプラグインは、さまざまな定義済みバンドルを生成する「bin」、「jar-with-dependencies」、「project」、および「src」であるデフォルトのアセンブリを提供します。
新しいアセンブリは、ほとんどの場合src/assembleにある新しいxmlファイルで定義する必要があります。次に、事前定義されたものの代わりに、次のようにロードされます。
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-Assembly-plugin</artifactId>
<version>2.2-beta-5</version>
<configuration>
<!-- disabled predefined Assembly -->
<!--
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
-->
<descriptors>
<descriptor>src/assemble/myAssembly.xml</descriptor>
</descriptors>
</configuration>
</plugin>