例如,如果我将 BukkitApi jar 设置为依赖范围设置为提供、编译、系统、运行时或测试的 maven 项目的依赖项
bukkitAPI 将在哪些范围内包含在编译输出中?
例如,如果我将 BukkitApi jar 设置为依赖范围设置为提供、编译、系统、运行时或测试的 maven 项目的依赖项
bukkitAPI 将在哪些范围内包含在编译输出中?
短版:默认情况下,maven 输出(在默认target
目录中)除了当前项目/模块的编译代码之外不包含任何内容。也就是说,没有任何依赖关系。
Long(er) 版本:具有默认jar
包装且没有自定义阶段配置。这是 maven 在 java 项目中的行为方式:
compile
阶段:目录.java
中的文件src/main/java/
被编译为.classes
目录中的target
文件。范围的依赖项compile
被下载到您的本地存储库。package
1 相同,另外您将在目录中获得一个jar
文件target
install
阶段:与 2 相同,您将在本地存储库中获得一个文件jar
。因此,.jar
默认情况下,依赖项中的文件不包含在任何内容中!
现在,例如,使用assembly
插件在package
阶段的输出中包含依赖项(请参阅使用 Maven 在 jar 中包含依赖项),您通常会得到以下默认行为:
provided
: 不包含compile
(默认):包括system
: 不包含runtime
: 包括test
: 不包含查看此链接以供参考。
编辑:只需尝试使用不同范围值 on 的这个 pom guice
,您就会看到依赖项包含在fake-1.0-SNAPSHOT-jar-with-dependencies.jar
when 范围为compile
andruntime
中(此示例不需要任何源文件)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.linagora</groupId>
<artifactId>fake</artifactId>
<version>1.0-SNAPSHOT</version>
<name>fake</name>
<dependencies>
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>2.0</version>
<scope>compile</scope>
<!-- system scope needs 'systemPath' attribute as well
<systemPath>/path/to/guice/guice-3.0.jar</systemPath>
<scope>system</scope>
-->
<!-- <scope>runtime</scope> -->
<!-- <scope>test</scope> -->
<!-- <scope>provided</scope> -->
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
</project>
这不是 Maven 的工作方式。依赖项只是指定类路径(用于编译、运行时、测试)。但默认情况下,依赖项不包含在输出中。您将必须发送所有依赖项 jar(至少是具有范围编译和运行时的那些)。
看看依赖插件。它提供了复制依赖项的目标。
要创建要装运的捆绑包,请查看组装插件(例如,创建 zip 文件)。它甚至提供了一种创建一体式罐子的方法,如果这是您所追求的。