我有一个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)。这是我现在的关键问题。
答案 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文件。