当maven jar项目打包到jar时它是如何工作的?

时间:2014-07-16 06:40:14

标签: java maven dependencies

我是maven的新手。我创建了一个maven项目,它将打包到JAR。我做了清洁包然后创建了jar。当我提取相同的jar时,我看不到我在打包的jar中的pom.xml中添加的任何依赖项(jar)。如果我将这个罐子交给第三方客户,那么代码如何在没有任何依赖罐的情况下工作?请帮我看看maven如何管理罐子?

谢谢!

3 个答案:

答案 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