java - 如何用库依赖链来分发Java应用程序?

标签 java maven jar dependencies

我有一个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)。这是我现在面临的关键问题。

最佳答案

您可以使用ma​​ven-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/

相关文章:

java - 正则表达式变化

Git for Windows(64 位)中的 Maven classworlds.launcher.Launcher 错误

maven - 在父pom中定义Maven插件,但仅调用子项目中的插件

java - 在 Linux 上将 .jar 应用程序作为守护进程运行的原因

java - gradle 中的本地 Jar 依赖项 : how to import into code

java - 进程意外退出:构建失败,出现异常

java - Controller 内部未接收到参数

maven - 如何从现有原型(prototype)创建 Maven 原型(prototype)

java - JAR 文件在文件系统的不同位置表现不同

java - 检索百万条记录并将其插入表中