Java Maven:程序集插件根本没有运行

Java Maven:程序集插件根本没有运行,java,maven,packaging,Java,Maven,Packaging,我对Maven还很陌生,之前试过几次学习,觉得没有Maven我会更好。现在,(联合国)幸运的是,我不得不在一个我想参与的项目中使用Maven。我现在的问题是关于包装。我想制作一个包含所有依赖项的自包含(也称为“fat”)jar,一位与Maven打过交道的同事帮助我处理pom文件 我已经检查了他的pom文件,以及这里的样本等等。xml看起来合法,但插件根本没有运行。请注意,我没有得到任何错误,一切都很好,除了我没有得到“fatjar”。你知道这个问题的原因是什么吗 下面是pom.xml的相关部分。

我对Maven还很陌生,之前试过几次学习,觉得没有Maven我会更好。现在,(联合国)幸运的是,我不得不在一个我想参与的项目中使用Maven。我现在的问题是关于包装。我想制作一个包含所有依赖项的自包含(也称为“fat”)jar,一位与Maven打过交道的同事帮助我处理pom文件

我已经检查了他的pom文件,以及这里的样本等等。xml看起来合法,但插件根本没有运行。请注意,我没有得到任何错误,一切都很好,除了我没有得到“fatjar”。你知道这个问题的原因是什么吗

下面是pom.xml的相关部分。我看到过关于
标记定位的矛盾代码示例,尝试了我发现的几乎所有变体,仍然没有乐趣

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>2.3</version>
  <executions>
    <execution>
        <id>make-jar-with-dependencies</id> <!-- this is used for inheritance merges -->
        <phase>package</phase> <!-- bind to the packaging phase -->
        <goals>
            <goal>single</goal>
        </goals>
    </execution>
  </executions>
  <configuration>
    <finalName>ProjectName</finalName>
    <appendAssemblyId>true</appendAssemblyId>
    <descriptorRefs>
      <descriptorRef>jar-with-dependencies</descriptorRef>
    </descriptorRefs>
    <archive>
      <manifest>
        <mainClass>org.mydomain.ProjectName</mainClass>
        <addClasspath>true</addClasspath>
      </manifest>
    </archive>
  </configuration>
</plugin>

我建议使用创建一个uberjar,因为它的意图正是这个目的。您也可以使用maven assembly插件来实现这一点

因此,在查看了您的pom后,我了解了问题所在。首先,您在pluginManagement块中定义了maven assembly插件,它将不执行插件,此外,您还将maven assembly插件单独定义为一个依赖项,这是多余的。这意味着只需从pom中删除以下内容:

<dependency>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-assembly-plugin</artifactId>
   <version>2.3</version>
   <type>maven-plugin</type>
</dependency>

org.apache.maven.plugins

此外,你应该考虑其他人将在代理后使用项目等,而不是他必须更改你的pom以使我工作,或者不能使用它,因为你在你的pom中定义了存储库,他无法访问

依赖项看起来像

    <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <descriptors>
                    <descriptor>src/main/assembly/assembly.xml</descriptor>
                </descriptors>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>attached</goal>
                    </goals>
                </execution>
            </executions>
    </plugin>

org.apache.maven.plugins
maven汇编插件
src/main/assembly/assembly.xml
包裹
附属的
您还需要定义assembly.xml,下面是一个示例

<assembly>
    <formats>
        <format>zip</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
        <dependencySet>
            <outputDirectory>/lib</outputDirectory>
        </dependencySet>
    </dependencySets>
    <fileSets>
        <!-- move all the .jar from target to /lib -->
        <fileSet>
            <directory>target</directory>
            <outputDirectory>/lib</outputDirectory>
            <includes>
                <include>*.jar</include>
            </includes>
            <!--  include *.jar places the same version of >App.jar
            twice in the lib, we need remove one -->
            <excludes>
                <exclude>App*.jar</exclude>
            </excludes>

        </fileSet>
        <!-- move .bat from scripts to /scripts -->
        <fileSet>
            <directory>src/main/assembly/scripts</directory>
            <outputDirectory>/bin</outputDirectory>
            <includes>
                <include>*.bat</include>
            </includes>
        </fileSet>
    </fileSets>
</assembly>

拉链
假的
/解放党
目标
/解放党
*jar先生
App*.jar
src/main/assembly/scripts
/垃圾箱
*蝙蝠先生

也许你可以使用shade插件(这就是我使用的插件)

注意,依赖项包含在最终的JAR中。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <finalName>standalone-${artifactId}</finalName>
                <archive>
                    <manifest>
                        <mainClass>com.mypckg.Launcher</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

org.apache.maven.plugins
maven阴影插件
包裹
阴凉处
独立-${artifactId}
com.mypckg.Launcher

关于

我想就我的一个错误提供一个建议:我的xml如下所示:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            ...all your configuration here..
        </plugin>
    </plugins>
</build>
<plugins>
    <plugin>
        <groupId>org.maven...</groupId>
        <artifactId>myArtifact</artifact>
        <configuration>
            <descriptorRefs>....</descriptorRefs>
            ...
            <executions>
                <execution>
                    <phase>package</phase>
                    ....
                </execution>
            </executions>
        </configuration>
    </plugin>
</plugins>

org.maven。。。
我的神器
....
...
包裹
....

块应该是
块的兄弟,而不是子块。我一修复这个问题,我的插件就开始在我的构建中再次执行。

我对这个问题有另一种看法,这帮助我解决了%subc%。如果您阅读了关于如何制作可执行jar和带有依赖项的jar的文章,他们通常会提供代码片段,新手会尝试将这些代码片段复制到pom.xml中。那些不太了解pom.xml文件(又名me)的实际结构的人,这是一项相当困难的任务。我以这个(不起作用的)解决方案结束:

 <project>
  ......

 <build>
   <pluginManagement>
      <plugins>
        <plugin>
          <artifactId>maven-assembly-plugin</artifactId>
          <version>3.2.0</version>
          <configuration>
            ............
          </configuration>

          <executions>
            ..............
          </executions>
        </plugin>
      </plugins>
   </pluginManagement>
  </build>
</project>

......
是的,你不会犯同样的错误。但对我来说,这是一个巨大的未知,如果你从未使用过父项目,请确保你不会落入同样的陷阱。经过一些调整,这里是一个正在运行的maven汇编插件设置(在pom.xml中有正确的上下文)


4.0.0
等等
一些人工制品
1.0-快照
...
maven汇编插件
3.2.0
假的
真的
com.blah.blah.YourMainClass
带有依赖项的jar
组装
包裹
单一的

您如何称呼该项目?我不完全确定您的意思,但如果我理解正确,您会问我如何运行该项目?我通过终端和eclipse内部进行了尝试。没有区别…只要检查一下您是否只是从控制台执行mvn清理包。您是否可以在控制台上发布执行期间的输出?您是否在pluginManagement块中定义了程序集插件?你能发布完整的pom(可能在粘贴箱上)吗?或者你有多模块构建吗?这里是POM文件的大部分。注意,我删除了一些关于原始作者隐私的java依赖项,我非常确定它们与手头的问题无关,所以这应该不是什么大问题。所提到的插件之间有什么区别吗?顺便说一句,汇编插件也应该可以工作,就像你提到的,因此我不确定切换到其他插件是否是这里的神奇解决方案。[回复:编辑]将插件作为依赖项是解决问题的一次绝望的尝试,我可以证明它在
 <project>
  ......

 <build>
   <pluginManagement>
      <plugins>
        <plugin>
          <artifactId>maven-assembly-plugin</artifactId>
          <version>3.2.0</version>
          <configuration>
            ............
          </configuration>

          <executions>
            ..............
          </executions>
        </plugin>
      </plugins>
   </pluginManagement>
  </build>
</project>
<?xml version="1.0" encoding="UTF-8"?>

<project>
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.blah.blah</groupId>
  <artifactId>some-artifact</artifactId>
  <version>1.0-SNAPSHOT</version>

  <dependencies>
   ...
  </dependencies>

  <build>
      <plugins>
        <plugin>
          <artifactId>maven-assembly-plugin</artifactId>
          <version>3.2.0</version>
          <configuration>
            <appendAssemblyId>false</appendAssemblyId> <!-- nicer looking jar name -->
            <archive>
              <manifest>
                <addClasspath>true</addClasspath>
                <mainClass>com.blah.blah.YourMainClass</mainClass>
              </manifest>
            </archive>
            <descriptorRefs>
              <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
          </configuration>

          <executions>
            <execution>
              <id>make-assembly</id> 
              <phase>package</phase>
              <goals>
                <goal>single</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
      </plugins>
  </build>
</project>