当前位置: 首页 > 知识库问答 >
问题:

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

周意智
2023-03-14

我有一个Java项目Foo,它依赖于bar。jar及其maven构建如下所示:

--福/

----foo.jar

----lib/

------酒吧。罐子

------(其他自由罐)

福娃。jar的舱单。MF具有字段类路径:。lib/bar。罐子(其他库jar)Main类:com。美国广播公司。福。Main并且可以通过命令java-jarfoo调用它。jar

酒吧。jar是从另一个依赖于httpclient-4.5的Java项目栏创建的。罐子

所以问题是,当发布包含bar的Foo构建时。jar已经在它的子文件夹库中了,我是否需要包含httpclient-4.5。还有罐子吗?

更新:我发现我想问的真正问题是关于传递依赖。根据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)。这是我现在面临的关键问题。

共有1个答案

陆英毅
2023-03-14

您可以使用maven assembly插件,您可以为您的java项目构建一个捆绑包zip。

例如

在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时,那么在目标文件夹中,捆绑包必须显示为foo-dist.zip

在zip中,您将在/lib文件夹栏中找到它。jar和在forlder/bin-foo中声明为依赖项的每个其他jar。罐子

 类似资料:
  • 我下载了一个Maven项目,可以运行来构建目标helloworld。jar,它依赖于多个第三方运行时jar。但是,我不知道如何使用Maven将这些第三方JAR自动复制到特定目录中。查看pom。xml,我发现了以下语句。因此,基本上我希望将第三方JAR复制到。要做到这一点,我应该使用哪个maven插件/短语/目标?有人能给我看一个可运行的maven语法吗?谢谢

  • 我正试图用下面的“为Android设置Firebase实时数据库”的例子写入我的数据库,但应用程序在启动时崩溃。 似乎是因为依赖: 我的应用程序Build.Gradle: 如何解决此问题?

  • 我将描述我的CMake项目目前是如何安排的。现在还早,所以欢迎提出更好的安排。 顶级 lib1 lib2 我在每个级别上都有cmakelists.txt。 在Lib1 I add_library(STATIC)中,然后使用Lib2 target_link_library,它也是静态的。 lib2的cmakelists.txt执行对Qt5Widgets、Qt5Core和qt5gui的find_pac

  • 问题内容: 我正在通过JNI运行一个库(我没有写过),并且在内部它调用了另一个DLL。除非我将另一个DLL的路径放在系统PATH变量上(我在Windows XP上),否则我会收到一条错误消息:“找不到依赖的库”。我希望能够在Java命令行上处理此问题,并且我已经尝试将其添加到- Djava.library.path和classpath中,但都没有起作用(我希望- Djava.library.pat

  • 添加Lib库依赖关系有两种方式: 非管理依赖方式,是通过将依赖的Jar包放到项目的lib目录 管理依赖方式,是在工程构建配置中配置依赖关系,sbt会自动从托管代码库中下载依赖库 非管理依赖方式 很多人用管理依赖的方式替代非管理方式,其实非管理方式用起来非常方便。非管理依赖方式的工作原理就是将jar包放到lib目录下,sbt会自动的将其添加到classpath中。也可以将一些测试依赖放到lib目录下

  • 我有一个库,其中我从内部工件中排除了依赖项,当我在客户端应用程序中使用该库时,它会抛出一个java.lang.ClassNotFoundException:io.confluent.monitoring.clients.interceptor.MonitoringProducerInterceptor 如何在我的应用程序中覆盖此排除而不排除此依赖项?