我是maven的新手。我创建了一个maven项目,它将打包到JAR。我做了清洁包然后创建了jar。当我提取相同的jar时,我看不到我在打包的jar中的pom.xml中添加的任何依赖项(jar)。如果我将这个罐子交给第三方客户,那么代码如何在没有任何依赖罐的情况下工作?请帮我看看maven如何管理罐子?
谢谢!
答案 0 :(得分:0)
Maven根据您配置依赖项插件的方式处理依赖项。
有关如何执行此操作的简单示例,请参阅this reference。
在此示例中,以下代码配置依赖项的最终位置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.5.1</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<includeGroupIds>log4j</includeGroupIds>
<outputDirectory>${project.build.directory}/dependency-jars/</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
然后这段代码为你的主jar设置了类路径,这将允许任何运行它的人找到这些依赖项
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.mkyong.core.App</mainClass>
<classpathPrefix>dependency-jars/</classpathPrefix>
</manifest>
</archive>
</configuration>
</plugin>
您的另一个选择是创建一个包含所有依赖项的jar,遵循this example here
如果您想尝试以这种方式向用户提供文件,则可以分发jar和POM文件,但是他们需要能够访问保存这些依赖项的Maven存储库。
答案 1 :(得分:0)
核心maven没有处理这个问题。 Maven是一个构建工具,它的工作是构建一个工件(在你的情况下是一个jar)。您需要在模块的pom.xml文件中定义的依赖关系才能获得编译的代码。你需要maven插件才能这样做。
现在,您不是要了解已编译的二进制文件的构建,而是分发。
如果我理解它应该是很多罐子(你和你的依赖)。或者,您可以将代码分发为jar + dependencies。
示例:
第一种情况:
如果您的代码位于模块A中(例如,代码位于包org.a. *中)并且取决于某些第三方(例如,log4j,其类位于org.apache.log4j中),那么您可能期望jar将只包含模块a的类,并且您希望模块的用户自动添加log4j(第一种情况)。
第二种情况:
模块a.jar将包含org.a. *和org.apache.log4j。*类,所有内容都在同一个模块中。
一般来说,第一种方法更健康&#34;在这种情况下,你不应该在maven中做任何事情。也许您的分发工具/文档应包含此信息。 如果有人在他/她的代码中使用模块a,如第三方(如果你开发框架或其他东西),并且如果他/她的项目是mavenized,那么你已经定义了对log4j的依赖将使maven成为下载log4j以及你的a.jar(在maven表示法中,这称为&#34;传递依赖&#34;)。
如果您对第二种情况感兴趣(如果您定义了一些&#34;客户端应用程序&#34;,例如&#34; jndi客户端用于某些服务器&#34;例如),那么这可能是相关的可能想查看Maven shade plugin
请注意这会导致依赖性地狱(如果使用您的客户端的应用程序也使用log4j会怎样?如果log4j-s的版本不同,那该怎么办)/
总而言之,您可能需要第一种方法,在决定采用第二种方法之前请三思而后行:)
如果您只想下载模块的所有依赖关系,请再提示一下#34; a&#34;您可能想要使用maven依赖插件 - 在命令提示符下键入以下内容
mvn dependency:copy-dependencies
您将在target / dependencies文件夹中找到所有依赖项
希望这有助于和快乐的mavening
答案 2 :(得分:0)
问题的最简单的解决方案是使用maven-assembly-plugin,它可以创建具有以下依赖关系的jar:
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<id>distro-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
之后,您可以分发包含已定义依赖项的已创建jar xyz-1.0-jar-with-dependencies
。
如果您需要更多地控制如何创建生成的工件,或者是否需要覆盖某些文件等,您可以更深入地了解maven-shade-plugin