2015-10-12 76 views
1

我需要构建一个分发jar-with-dependencies,其中包含因某些原因无法放置到Maven .m2/repository中的一个依赖jar。 在我的POM文件我有:maven-assembly-plugin如何从存储库中包含jar文件

<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-与-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.xml 组装ID罐子,用 - 依赖性被多次使用。 下面的模式从来没有在这件神器包含过滤器触发: O“./lib/mylib_3.0.0_258779.jar”

的结果是一样的。不包括这个罐子里的类。

如果有人做了类似的事情,我会欣赏一些指针。

+0

为什么这个工件只是简单地上传到资源库管理器,就是这样...? – khmarbaise

回答

0

期望在运行时提供具有system作用域的依赖关系。引用Maven文档:

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

这样,maven-assembly-plugin包括那些依赖关系(因为它是预期的是,提供的话)。请注意,如果切换到maven-shade-plugin,此结果将完全相同。

只有在你的问题的办法是使用system范围(which you should never have used to begin with)。相反,将这个库安装到您的Maven仓库中,然后在POM中声明它,就像您对任何常规依赖关系所做的那样(有关更多信息,请参阅this answer)。

+0

顺便说一下,使用dependencySet或moduleSet时,部分实际上适用于工件,而不适用于文件名。 – mcoolive

相关问题