2016-09-13 88 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

相關問題