簡単に解決できるはずのMavenの問題がありますが、少し難しいことがわかっています。
jarをビルドするプロジェクトがあり、クラスを実行できるようにするにはそのjarがcom.foo.bar.MainClass
必要ですが、いくつかのスクリプトとその依存関係とともにデプロイできる必要があります。
some-product-1.0.0.zip
bin/
some-product.sh
lib/
some-product-1.0.0.jar
dependency1.jar
dependency2.jar
この構造を非常に簡単に作成することができます。私pom.xml
のように見えます
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.foo.bar.MainClass</mainClass>
<addClasspath>true</addClasspath>
</manifest>
</archive>
<descriptors>
<descriptor>assembly.xml</descriptor>
</descriptors>
</configuration>
</plugin>
そして私assembly.xml
は
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>bin</id>
<formats>
<format>zip</format>
</formats>
<files>
<file>
<source>src/main/scripts/some-product.sh</source>
<outputDirectory>/bin</outputDirectory>
</file>
</files>
<dependencySets>
<dependencySet>
<outputDirectory>/lib</outputDirectory>
<useProjectArtifact>true</useProjectArtifact>
<scope>compile</scope>
</dependencySet>
</dependencySets>
</assembly>
そしてsome-product.sh
のように見えます
SCRIPTLOC=$( readlink -f $( dirname "${BASH_SOURCE[0]}" ) )
LIBS="$( dirname $SCRIPTLOC )/lib"
# builds a : joined list of all the jars in the lib directory
MYCLASSES=$(echo $LIBS/*.jar | tr ' ' ':')
java -cp "$CLASSPATH:$MYCLASSES" com.foo.bar.MainClass
しかし、スクリプトを実行したときに得たのは
Exception in thread "main" java.lang.NoClassDefFoundError: com/foo/bar/MainClass
Cause by: java.lang.ClassNotFoundException com.foo.bar.MainClass
at ...
Could not find the main class: com.foo.bar.MainClass. Program will exit.
クラスを含むjarを調べたところ、マニフェストには
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: <myname>
Build-Jdk: 1.6.0_27
マニフェストにメインクラスが追加されなかったと言っています。
私は運がなくてかなり長い間この問題をグーグルで検索しました、そしてアセンブリプラグインのウェブサイトの例はひどいです。Mavenにこのjarを正しくビルドさせ、zipに追加するにはどうすればよいですか?
編集:pomにmaven-jar-pluginが必要でしたが、実際の問題は、Cygwinを使用していて、期待したクラスパスセパレーターが使用されて;
いなかったこと:
です。私の解決策は、使用するクラスパスセパレーターを特定するためのコードを作成することでした。jarプラグインを使用すると、完全に機能するようになりました。