2016-09-13 60 views
0

我有一个Java项目富,但对bar.jar依赖及其Maven构建是如下:如何使用库依赖链来分发Java应用程序?

- 富/

---- foo.jar中

--- - LIB/

------ bar.jar

------(其他LIB罐)

的foo.jar中的MANIFEST.MF有场Class-Path: . lib/bar.jar ... (other lib jars)和,它可以通过命令调用java -jar foo.jar

bar.jar是从另一个依赖于httpclient-4.5.jar的Java项目栏创建的。

所以问题是,在分发其子文件夹lib中包含bar.jar的Foo版本时,是否也需要包含httpclient-4.5.jar?


更新: 我想通了,真正的问题,我想问的是关于传递依赖。根据https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Transitive_Dependencies,Maven能够发现自己的lib需要的lib(依赖)。

在我的情况是,Maven可以找出foo取决于酒吧和酒吧取决于httpclient-4.5.jar,它会抓取httpclient-4.5.jar到Project Foo的Maven Dependencies列表。

这适用于我项目中的大多数依赖项,即依赖项的依赖项也出现在我的Maven依赖项中。但是,有一个依赖项(bar.jar),Maven不会检索它的依赖项(httpclient-4.5.jar)。这是我现在的关键问题。

回答

1

你可以使用maven-assembly-plugin与它你可以建立一个捆绑zip为分发你的java项目。

在pom.xml

例如

<dependencies> 

    <!-- foo dependencies --> 
    <dependency> 
     <groupId>com.company.bar</groupId> 
     <artifactId>bar</artifactId> 
     <version>1.0.0-RELEASE</version> 
    </dependency> 

</dependencies> 

<build> 

    <finalName>foo</finalName> 

    <resources> 
     <resource> 
      <directory>src/main/resources</directory> 
     </resource> 
    </resources> 

    <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-jar-plugin</artifactId> 
       <version>2.6</version> 
       <configuration> 
        <archive> 
         <manifest> 
          <addClasspath>true</addClasspath> 
          <classpathPrefix>../lib/</classpathPrefix> 
         </manifest> 
         <manifestEntries> 
          <Build-Time>${maven.build.timestamp}</Build-Time> 
          <Build-Host>${agent.name}</Build-Host> 
          <Build-User>${user.name}</Build-User> 
          <Build-Maven>Maven ${maven.version}</Build-Maven> 
          <Build-Java>${java.version}</Build-Java> 
          <Build-OS>${os.name}</Build-OS> 
          <Build-Label>${project.version}</Build-Label> 
          <Build-Path>${basedir}</Build-Path> 
          <Build-Number>${buildNumber}</Build-Number> 
         </manifestEntries> 
        </archive> 
       </configuration> 
      </plugin> 
     <plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <version>2.5.5</version> 
      <executions> 
       <execution> 
        <id>distro-assembly</id> 
        <phase>package</phase> 
        <goals> 
         <goal>single</goal> 
        </goals> 
        <configuration> 
         <descriptors> 
          <descriptor>src/main/asembly/asembly.xml</descriptor> 
         </descriptors> 
         <!-- <finalName>${project.artifactId}-${project.version}.jar</finalName> --> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

你必须给的什么它是在束引入asembly.xml

<?xml version="1.0" encoding="UTF-8"?> 
<assembly 
    xmlns="http://maven.apache.org/plugins/maven-assembly-  plugin/assembly/1.1.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> 

<id>dist</id> 
<formats> 
    <format>zip</format> 
</formats> 
<includeBaseDirectory>true</includeBaseDirectory> 
<fileSets> 
    <fileSet> 
     <directory>target</directory> 
     <outputDirectory>./bin/</outputDirectory> 
     <includes> 
      <include>foo.jar</include> 
     </includes> 
    </fileSet> 
    <fileSet> 
     <includes> 
      <include>readme.txt</include> 
     </includes> 
    </fileSet> 
</fileSets> 
<dependencySets> 
    <dependencySet> 
     <outputDirectory>/lib/</outputDirectory> 
     <useProjectArtifact>false</useProjectArtifact> 
     <unpack>false</unpack> 
     <scope>runtime</scope> 
    </dependencySet> 
</dependencySets> 
</assembly> 

当你这样做的规范mvn clean install然后在目标forlder中,必须出现捆绑为foo-dist.zip

在压缩文件中,您将在/ lib文件夹bar.jar中声明每个其他jar声明为依赖项,并在forlder/bin foo.jar中声明。

+0

感谢您举例说明。我更新了我的问题。你认为maven-assembly-plugin仍然适合吗? – Lee

+0

实际上,只有当问题出现在包含所有依赖关系的分布式独立可执行程序包时才适用。阅读你的更新这个问题是另一回事。 – johnnynemonic

+0

尝试观察de bar.jar pom.xml并验证httpclient-4工件依赖关系是如何声明的,验证依赖关系之间的某种冲突或bar.jar pom中的声明。xml与范围传递也是一致的,或者不被排除等等。否则,总是可以包含h​​ttpclient-4神器作为依赖在foo.jar中的pom.xml,在这种情况下必须出现Maven依赖关系 – johnnynemonic

相关问题