1

簡単に解決できるはずの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プラグインを使用すると、完全に機能するようになりました。

4

1 に答える 1

3

私が見る2つのことは

  1. classpathが正しく設定されていません。

     SCRIPTLOC=$( readlink -f $( dirname "${BASH_SOURCE[0]}" ) )
    

    ここで、SCRIPTLOCはルートディレクトリではありません。です<the_complete_path_from_root>/bin

     LIBS="$( dirname $SCRIPTLOC )/lib"
    

    これは最終的に評価されます<the_complete_path_from_root>/bin/lib

    そして、後でそのlibフォルダを追加しますが、実際にはjarが含まれていません。したがって、クラスパスに追加される正しいパスはlib 、jarが存在するフォルダーであり、それにより、を見つけることができますcom.foo.bar.MainClass

  2. Mainクラスをマニフェストファイルに追加するには、以下をファイルに追加する必要がありpom.xmlます。

    <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-jar-plugin</artifactId>
         <configuration>
           <archive>
             <manifest>
               <mainClass>com.someclass.Main</mainClass>
               <packageName>com.someclass</packageName>
             </manifest>
             <manifestEntries>
                  <mode>development</mode>
                  <url>${pom.url}</url>
              </manifestEntries>
            </archive>
          </configuration>
      </plugin>
    
于 2013-02-14T17:33:41.160 に答える