13

ここで無知に聞こえて申し訳ありませんが、私はMavenを初めて使用し、非常に単純であると確信しているものに頭を悩ませてきました。

ドキュメントは言う:

[...] プロジェクトは、ルート ディレクトリにあるプロジェクトの JAR アーティファクト、lib/ ディレクトリにあるランタイム依存関係、およびスタンドアロン アプリケーションを起動するためのシェル スクリプトを含む ZIP アセンブリを生成できます。

それはまさに私がやりたいことです!しかし、私はそれを実現できないようです。

私のPOMは次のとおりです。

<project>
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.anearalone</groupId>
   <artifactId>myapp</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>
   [...]
   <build>
      <finalName>myapp</finalName>
      <plugins>
         <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-assembly-plugin</artifactId>
         <version>2.2.1</version>
         <executions>
            <execution>
               <id>make-assembly</id>
               <phase>package</phase>
               <goals>
                  <goal>single</goal>
               </goals>
               <configuration>
                  <descriptors>
                     <descriptor>src/main/assemble/dist.xml</descriptor>
                  </descriptors>
                  <archive>
                     <manifest>
                        <mainClass>com.anearalone.myapp.CLI</mainClass>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                     </manifest>
                  </archive>
               </configuration>
            </execution>
         </executions>
      </plugin>
   </plugins>
</build>
[...]
</project>

参照された dist.xml は次のようになります。

<assembly>
   <id>dist</id>
   <formats>
      <format>zip</format>
   </formats>
   <files>
      <file>
         <outputDirectory>/</outputDirectory>
         <source>src/main/bin/arkify.sh</source>
         <fileMode>755</fileMode>
      </file>
   </files>
   <dependencySets>
      <dependencySet>
         <useProjectArtifact>false</useProjectArtifact>
          <includes>
             <include>*:jar</include>
          </includes>
          <outputDirectory>/lib</outputDirectory>
      </dependencySet>
      <dependencySet>
         <useProjectArtifact>true</useProjectArtifact>
         <includes>
            <include>com.anearalone:myapp:jar:0.0.1-SNAPSHOT</include>
         </includes>
         <outputDirectory>/</outputDirectory>
      </dependencySet>
   </dependencySets>
</assembly>

これにより、zipファイルで必要なレイアウトが実現されます(ただし、正しい方法でそこに到達していないことは確かです)が、2つのjarファイルtarget/(1つはzipアーカイブに、もう1つはルートにあります)を取得し、どちらも取得しませんそれらの結果には、私の mainClass エントリが含まれていますMANIFEST.MF

を「pom」に変更するproject.packagingと、これは正しいかもしれませんが、もちろん余分な jar (のルートにある)target/は消えますが、次の警告が表示されます。

[WARNING] Cannot include project artifact: com.anearalone:myapp:pom:0.0.1-SNAPSHOT; it doesn't have an associated file or directory.
[WARNING] The following patterns were never triggered in this artifact inclusion filter:
o  'com.anearalone:myapp'

...そして実際、私のアーティファクトはアーカイブになく、まだエントリが追加されていませんMANIFEST.MF

初心者を助ける時間がある人はいますか?

4

1 に答える 1

9

私があなたの問題を正しく理解していれば、あなたの ZIP は正しく作成されていますが、そこにmy-app-0.0.1-SNAPSHOT含まれている (ディレクトリに直接配置されている JAR と同様にtarget/) ファイルにメイン クラスが含まれていませんMANIFEST.MFか?

実際、assemblyプラグインはそのようなタスクの実行専用ではありません。これは、プロジェクトのメイン クラスで示す方法を提供するJAR プラグインのタスクです。この設定を現在の に追加するだけです:MANIFEST.MF pom.xml

<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    ...
    <configuration>
      <archive>
        <manifest>
          <addClasspath>true</addClasspath>
          <mainClass>my.app.MainClass</mainClass>
        </manifest>
      </archive>
    </configuration>
  </plugin>
</plugins>

プロジェクトのパッケージをパッケージに変更しようとしたことについてpom: それは悪い考えでした;) 実際、pomパッケージはそれ自体以外のリソースなしでプロジェクトに使用されpom.xmlます。他のプロジェクトの親pom.xmlとして定義したり、複数のモジュールを集約したりするのに非常に便利です。

于 2011-04-19T06:39:59.803 に答える