3

例如,如果我将 BukkitApi jar 设置为依赖范围设置为提供、编译、系统、运行时或测试的 maven 项目的依赖项

bukkitAPI 将在哪些范围内包含在编译输出中?

4

2 回答 2

7

短版:默认情况下,maven 输出(在默认target目录中)除了当前项目/模块的编译代码之外不包含任何内容。也就是说,没有任何依赖关系。

Long(er) 版本:具有默认jar包装且没有自定义阶段配置。这是 maven 在 java 项目中的行为方式:

  1. compile阶段:目录.java中的文件src/main/java/被编译为.classes目录中的target文件。范围的依赖项compile被下载到您的本地存储库。
  2. 阶段:与package1 相同,另外您将在目录中获得一个jar文件target
  3. install阶段:与 2 相同,您将在本地存储库中获得一个文件jar

因此,.jar默认情况下,依赖项中的文件不包含在任何内容中!

那么,如何在“输出”中包含依赖项,这些范围是什么意思?

现在,例如,使用assembly插件在package阶段的输出中包含依赖项(请参阅使用 Maven 在 jar 中包含依赖项),您通常会得到以下默认行为:

  • provided: 不包含
  • compile(默认):包括
  • system: 不包含
  • runtime: 包括
  • test: 不包含

查看此链接以供参考。

编辑:只需尝试使用不同范围值 on 的这个 pom guice,您就会看到依赖项包含在fake-1.0-SNAPSHOT-jar-with-dependencies.jarwhen 范围为compileandruntime中(此示例不需要任何源文件)

<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>
于 2012-11-23T14:55:41.233 回答
3

这不是 Maven 的工作方式。依赖项只是指定类路径(用于编译、运行时、测试)。但默认情况下,依赖项不包含在输出中。您将必须发送所有依赖项 jar(至少是具有范围编译和运行时的那些)。

看看依赖插件。它提供了复制依赖项的目标。

要创建要装运的捆绑包,请查看组装插件(例如,创建 zip 文件)。它甚至提供了一种创建一体式罐子的方法,如果这是您所追求的。

于 2012-11-23T14:40:33.633 回答