我有一个Java项目Foo,它依赖于bar.jar,它的maven构建如下:
-- foo/
---- foo.jar
---- 库/
------ bar.jar
------(其他lib jar)
foo.jar 的 MANIFEST.MF 具有字段 Class-Path: 。 lib/bar.jar ...(其他 lib jars)
和 Main-Class: com.abc.foo.Main
并且可以通过命令 java -jar foo 调用.jar
bar.jar 是从另一个 Java 项目 Bar 创建的,该项目依赖于 httpclient-4.5.jar。
所以问题是,当分发 Foo 的构建时,其子文件夹 lib 中已包含 bar.jar,我是否还需要包含 httpclient-4.5.jar?
<小时/>更新: 我发现我想问的真正问题是关于传递依赖的。根据https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Transitive_Dependencies ,Maven能够发现你自己的lib需要的lib(依赖)。
在我的例子中,Maven 可以确定 foo 依赖于 bar,而 bar 依赖于 httpclient-4.5.jar,并且它将把 httpclient-4.5.jar 抓取到 Project Foo 的 Maven 依赖项列表中。
这对于我的项目中的大多数依赖项都很有效,即依赖项的依赖项也出现在我的 Maven 依赖项中。但是,有一个依赖项 (bar.jar) Maven 不会检索其依赖项 (httpclient-4.5.jar)。这是我现在面临的关键问题。
最佳答案
您可以使用maven-assemble-plugin,您可以构建一个 bundle 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>
您必须将 bundle 中的内容指定到 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 时,然后在目标文件夹中, bundle 必须显示为 foo-dist.zip
在 zip 中,您将在/lib 文件夹中找到 bar.jar,以及声明为依赖项的所有其他 jar 以及在 forlder/bin foo.jar 中。
关于java - 如何用库依赖链来分发Java应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39479818/