麻烦开始使用maven程序集插件

JSt*_*oop 13 maven-2 maven-assembly-plugin

我很遗憾在这里听起来很无知,但我是Maven的新手,并且一直在抨击我肯定非常简单的事情.

文件说:

[...]项目可以生成一个ZIP程序集,其中包含根目录中项目的JAR工件,lib /目录中的运行时依赖项以及用于启动独立应用程序的shell脚本.

正是我想要做的!但我似乎无法实现它.

我的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>
Run Code Online (Sandbox Code Playgroud)

引用的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>
Run Code Online (Sandbox Code Playgroud)

这实现了我想要的zip文件布局(虽然我很确定我没有以正确的方式到达那里)但是我得到两个罐子target/(一个在zip存档中,另一个在根目录中),并且都没有其中包括我的mainClass条目MANIFEST.MF.

如果我project.packaging改为"pom",我认为这可能是正确的,当然是额外的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'
Run Code Online (Sandbox Code Playgroud)

......实际上我的工件不在存档中,并且仍然没有添加任何条目MANIFEST.MF.

有人有时间帮助初学者吗?

Rom*_*las 9

如果我正确理解您的问题,您的ZIP是否已正确创建,但其中my-app-0.0.1-SNAPSHOT包含的内容(以及直接位于target/目录中的JAR )不包含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>
Run Code Online (Sandbox Code Playgroud)

关于您尝试将项目的pom包装更改为包装:这是一个坏主意;)实际上,pom包装用于项目而没有任何其他资源而不是pom.xml自身.它pom.xml被定义为其他项目的父项聚合多个模块非常有用.