如何使用库依赖链分发Java应用程序?

时间:2016-09-13 22:20:09

标签: java maven jar dependencies

我有一个Java项目Foo,它依赖于bar.jar,它的maven构建如下:

- foo /

---- foo.jar

---- lib /

------ bar.jar

------(其他lib jar)

foo.jar的MANIFEST.MF有字段Class-Path: . lib/bar.jar ... (other lib jars)Main-Class: com.abc.foo.Main,可以通过命令java -jar foo.jar调用

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

所以问题是,当在子文件夹lib中分发包含bar.jar的Foo构建时,我是否还需要包含httpclient-4.5.jar?

更新: 我想出了我想问的关于传递依赖关系的真正问题。根据{{​​3}},Maven能够发现自己的lib所需的lib(依赖)。

在我的情况下,Maven可以弄清楚foo取决于bar和bar取决于httpclient-4.5.jar,它会抓取httpclient-4.5.jar到Project Foo的Maven Dependencies列表。

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

1 个答案:

答案 0 :(得分: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中的zip文件中,以及在forlder / bin foo.jar中声明为依赖项的所有其他jar文件。