2

如果问题标题不能说清楚,请带我在这里更详细地解释。假设我的一个 Maven 应用程序的生产 jar 需要用于我的另一个 Maven Web 应用程序。将该 jar 添加到我的第二个应用程序 Maven 依赖项中不会添加其传递依赖项。此外,jar 本身就是一个应用程序。

一种方法是查看第一个应用程序的 POM 并将它们添加到另一个应用程序的 POM 中。但是,当添加到某个项目时,中央 Maven jar 如何添加自己的传递依赖项。

换句话说,如果我将commons-io.jarMaven 依赖项添加到我的项目中,它会自动添加其传递依赖项。但是当我添加myjar.jar为 Maven 依赖项(范围-> 系统)时,它不会自动添加其传递依赖项。

我认为我应该将我的第一个应用程序开发为可以在这种情况下使用的其他原型。请告诉我如何进一步进行。

对不起这个新手问题。实际上,我是 Maven 新手,我已经开始使用 Netbeans-embedded-maven 来创建应用程序。我真的很喜欢 Maven 简化工作的方式。

edited

看来我应该更详细地解释一下。所以这就是它。

假设我编写了一个使用 A.jar、B.jar、C.jar 的程序/应用程序,而我的生产输出是 X.jar(根据 maven 默认构建,它显然不包含其他 jar)。上面的 A、B、C jar 存在于 maven 中央存储库中,并作为依赖项添加到我的项目中。项目构建 jar 是 X.jar

现在我编写了另一个应用程序,在其中添加了 X.jar 作为系统依赖项,现在我想要的是 A.jar、B.jar、C.jar 自动添加到项目中,因为它们是 X.jar 的传递依赖项

希望这次我已经解释清楚了。如果您之前没有理解,请原谅我的写作风格。

一种解决方案是使用类似这样的东西构建包含所有依赖项的 X.jar

 <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <mainClass>com.nitinsurana.mlmmaven.Start</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-my-jar-with-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

但我正在寻找能够自动添加系统依赖项的传递依赖项的东西。

4

4 回答 4

2

system范围不应该用于将与另一个应用程序打包的实际 jar 依赖项。引用官方文档:

范围系统的依赖关系始终可用,并且不在存储库中查找。它们通常用于告诉 Maven JDK 或 VM 提供的依赖项。因此,系统依赖关系对于解决对工件的依赖关系特别有用,这些工​​件现在由 JDK 提供,但之前可以单独下载。典型的例子是 JDBC 标准扩展或 Java Authentication and Authorization Service (JAAS)。

您应该使用默认compile范围。

于 2013-01-01T17:43:44.797 回答
0

我已经浏览了@Sean 提供的链接,看来我想要的似乎是不可能的。

我应该投票删除这个问题吗?

虽然答案是它不能完成,这就是为什么:

Project-A -> Project-B

上图表示 Project-A 依赖于 Project-B。当 A 在其 POM 中将 B 声明为可选依赖项时,这种关系保持不变。它就像在其类路径中添加 Project-B 的普通构建一样。

Project-X -> Project-A

但是当另一个项目(Project-X)在其 POM 中将 Project-A 声明为依赖项时,可选依赖项就会生效。您会注意到 Project-B 不包含在 Project-X 的类路径中;you will need to declare it directly in your POM in order for B to be included in X's classpath.

取自 官方文档

于 2013-01-02T07:52:18.847 回答
0

正如其他人所建议的那样,使用(默认)编译范围并添加<exclusions>您不想要/不需要的传递依赖项。

请参阅: Maven > 可选依赖项和依赖项排除

于 2013-01-01T18:09:54.637 回答
0

那么,您的X模块是 mavenized 吗?然后您可以在本地安装它mvn clean install,然后在具有所有传递依赖项和compile范围的另一个项目中使用它。这种情况很好,直到您在自己的机器上完成所有操作。只要您想与他人共享代码或配置您需要X的 CI 构建,其 pom 可供他人使用。最好的方法是拥有自己的工件,可以从所有其他机器访问。您X在那里安装并像往常一样使用它compile,只需要向 pom.xml 添加新的 repo。

于 2013-01-02T13:05:23.557 回答