Maven jar 依赖和关系
Posted
技术标签:
【中文标题】Maven jar 依赖和关系【英文标题】:Maven jar dependencies and relations 【发布时间】:2012-05-30 02:26:07 【问题描述】:我试图搜索现有问题,但找不到任何问题 - 感觉我的问题很简单,但可能是因为它非常具体,我无法在任何地方找到答案。
无论如何 - 我有 2 个使用 Maven 的项目,其中第二个依赖/需要第一个的某些类。在某些情况下,我希望依赖于 JAR 而不是项目依赖。
我通过使用 maven-jar-plugin 创建了一个额外的 jar 来解决这个问题,我在其中包含了所需的类。 jar 已正确创建并在 $project.build.directory 中输出。但是项目 A 的 pom 位于同一目录中,这对我和项目 B 来说都是痛苦的,因为项目 A 中使用了依赖项。 (有没有办法忽略 $project.build.directory 中的 pom ??? 比如:
<dependency>
<groupId>projectA.groupId</groupId>
<artifactId>A</artifactId>
<version>1x-SNAPSHOT</version>
<classifier>classes</classifier>
-> <ignorePom>true</ignorePom>
</dependency>
)。
现在我将系统范围用于依赖项,并且在添加系统路径后它可以正常工作。尽管在任何可能的地方都必须避免使用示波器系统。 Systempath 让我很恼火,因为这不是一个好的做法,而且是绝对路径。
我知道我可以使用
将创建的 jar 安装到存储库中mvn install:install -file
但我想尽可能地自动化这个过程,你有什么建议?
提前致谢
【问题讨论】:
【参考方案1】:最好的解决方案是使用存储库管理器并真正发布第一个 jar,并在您需要的地方建立真正的依赖关系。
根据您所写的内容,我建议创建一个单独的 maven 项目,其中包含将由其他几个模块使用的类,然后发布它并简单地使用对该模块的依赖。这将彻底解决您的问题。
【讨论】:
感谢 khmarbaise,事实上我创建了一个单独的 maven 项目,其中包含公共类。我已经有了这个想法,但我认为可能还有其他解决方案。【参考方案2】:Maven 不支持“依赖于 jars”。有“系统”的范围,但非常有限,可能会导致各种麻烦。如果你需要依赖一个 Jar,你需要给它分配一个唯一的 groupId 和 artifactId。如果您不想在 Maven 中构建它,可以将其部署到本地 repo 管理器(甚至使用 mvn install:install-file 部署到本地 repo)。
取决于带有分类器“工作”但不是很好的 jar,因为反应器无法正确地将它们包含在多模块项目中。
【讨论】:
【参考方案3】:您是否阅读过任何有关Maven 的文档?如果您的项目是使用 Maven 定义的,那么您无需执行任何特殊操作即可使依赖项正常工作。
根据您的需要,您有两种选择:创建两个独立的项目,其中一个依赖于另一个,或者您可以创建一个多模块项目,其中一个模块仍然依赖于另一个。
两个独立的项目
.
|-- A
| `-- pom.xml
| `-- src
| `-- main
| `-- java
`-- B
`-- pom.xml
`-- src
`-- main
`-- java
A/pom.xml
<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.company</groupId>
<artifactId>A</artifactId>
<version>1.0-SNAPSHOT</version>
</project>
B/pom.xml
<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.company</groupId>
<artifactId>B</artifactId>
<version>2.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.company</groupId>
<artifactId>A</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
就是这样!您对 B 中的项目/模块 A 有依赖。
您首先通过发出mvn install
(并位于目录A)来构建项目A。该工件将安装在您的本地存储库中(并可用于其他项目)。
然后您通过发出mvn install
(并且位于目录B 中)来构建项目B。该工件将安装在您的本地存储库中。
一个带有子模块的父项目
.
|-- A
| `-- pom.xml
| `-- src
| `-- main
| `-- java
`-- B
| `-- pom.xml
| `-- src
| `-- main
| `-- java
`-- pom.xml
pom.xml
<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.company</groupId>
<artifactId>parent</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>A</module>
<module>B</module>
</modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.company</groupId>
<artifactId>A</artifactId>
<version>$project.version</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
<depencdencyManagement/>
可以帮助子模块选择正确的版本。
A/pom.xml
<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>
<parent>
<groupId>com.company</groupId>
<artifactId>parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.company</groupId>
<artifactId>A</artifactId>
</project>
B/pom.xml
<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>
<parent>
<groupId>com.company</groupId>
<artifactId>parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.company</groupId>
<artifactId>B</artifactId>
<dependencies>
<dependency>
<groupId>com.company</groupId>
<artifactId>A</artifactId>
</dependency>
</dependencies>
</project>
使用此解决方案,您只需将自己定位在父文件夹中并运行mvn install
(或mvn package
等)。您现在将以正确的顺序构建 A 和 B,并且整个项目都可以导入到 Eclipse 中。
【讨论】:
Hallo maba,我认为您误解了这个问题:我提到“在某些情况下,我希望依赖于 JAR 而不是项目依赖。”我必须从项目 A 中创建一个 jar,否则我会遇到两个项目的公共依赖项和库的问题。以上是关于Maven jar 依赖和关系的主要内容,如果未能解决你的问题,请参考以下文章
Intellij 查找排除JAR包的依赖关系(Maven Helper)