maven-assembly-plugin如何包含来自存储库

时间:2015-10-12 23:41:09

标签: maven maven-assembly-plugin

我需要构建一个包含依赖jar的分发jar,其中包含一个依赖jar,由于某些原因无法放入Maven .m2 / repository。 在我的POM文件中,我有:

<dependencies>
    <dependency>
        <groupId>com.google.inject</groupId>
        <artifactId>guice</artifactId>
        <version>4.0</version>
    </dependency>
    <dependency>
        <groupId>com.abc.ets</groupId>
        <artifactId>mylib</artifactId>
        <version>3.0.0_258779</version>
        <scope>system</scope>
        <systemPath>${basedir}/lib/mylib_3.0.0_258779.jar</systemPath>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.5.5</version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <archive>
                    <manifest>
                        <mainClass>com.abc.myapp.service.MainService</mainClass>
                    </manifest>
                </archive>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id> <!-- this is used for inheritance merges -->
                    <phase>package</phase> <!-- bind to the packaging phase -->
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>                
        </plugin>       
    </plugins>
</build>

构建成功,但由此产生的MyApp-1.0.0-jar-with-dependencies.jar不包含该库中的类,因此抛出ClassNotFoundException。 我尝试创建assembly.xml文件来手动管理这个jar文件,但插件文档非常粗略和令人困惑。 这是我在assembly.xml中的内容

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
  <!-- TODO: a jarjar format would be better -->
  <id>jar-with-dependencies</id>
  <formats>
    <format>jar</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <dependencySet>
      <outputDirectory>/</outputDirectory>
      <useProjectArtifact>true</useProjectArtifact>
      <unpack>true</unpack>
      <scope>runtime</scope>
      <includes>
          <include>${basedir}/lib/mylib_3.0.0_258779.jar</include>
      </includes>
    </dependencySet>
  </dependencySets>
</assembly>

当我运行构建时,我正在

  

读取程序集描述符:src / assembly / assembly.xml   程序集id jar-with-dependencies不止一次使用。   在此工件包含过滤器中从未触发以下模式:   o&#39; ./ lib / mylib_3.0.0_258779.jar&#39;

结果是一样的。这个罐子里的课程都没有包括在内。

如果有人做过类似的事情,我会很感激。

1 个答案:

答案 0 :(得分:0)

预计在运行时提供具有system范围的依赖项。引用Maven文档:

  

范围系统的依赖关系始终可用,并且不会在存储库中查找。它们通常用于告诉Maven有关JDK或VM提供的依赖关系。因此,系统依赖关系对于解决现在由JDK提供的工件的依赖性特别有用,但是可以在早期单独下载时使用。

因此,maven-assembly-plugin包含这些依赖项(因为期望提供它们)。请注意,如果切换到maven-shade-plugin,此结果将完全相同。

围绕您的问题的唯一方式 NOT 使用system范围(which you should never have used to begin with)。相反,将此库安装到Maven仓库,然后像在任何正常依赖项中一样在POM中声明它(有关详细信息,请参阅this answer)。