Dav*_*vid 50 java build-process maven-2
同事们一直在兜售maven及其魔法依赖的奇迹,但我发现它在我认为显而易见的用途上失败了.
假设我有一个带有主POM的根文件夹.
然后我有一些项目,称他们为A和B.
B需要A,因此B文件夹中的POM中包含相应的依赖项
现在,回到根文件夹,在配置文件中,我指定我要构建B.
当我执行通常的mvn clean安装时,我得到了一个失败,因为A没有构建.
我的朋友告诉我,我必须在根目录中的主要配置文件中指定A和B.
但是不是maven看到B的依赖管理的全部要点,转到B POM文件,它看到对A的依赖,所以它应该自动构建A.
mil*_*ose 44
使用主POM:
~/scratch/pom.xml<?xml version="1.0" encoding="UTF-8"?>
<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>scratch</groupId>
<artifactId>scratch</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>nipple</module>
<module>cabbage</module>
</modules>
</project>
Run Code Online (Sandbox Code Playgroud)
和模块POM:
~/scratch/nipple/pom.xml<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>scratch</artifactId>
<groupId>scratch</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>scratch</groupId>
<artifactId>nipple</artifactId>
<version>1.0-SNAPSHOT</version>
</project>
Run Code Online (Sandbox Code Playgroud)
~/scratch/cabbage/pom.xml<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>scratch</artifactId>
<groupId>scratch</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>scratch</groupId>
<artifactId>cabbage</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>scratch</groupId>
<artifactId>nipple</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
Run Code Online (Sandbox Code Playgroud)
mvn package清除完本地存储库后,我可以在根目录中发出问题,最终得到所有构建的模块.(进入空洞的JAR,但已建成.)
Maven似乎在存储库或正在进行的构建中寻找依赖关系.当您只构建单个模块时,它不会自动遍历您的项目结构,因为您不需要在计算机上拥有父项目,更不用说当前模块上方的一个目录.(亲子关系甚至不是双射的.)
之所以如此,可能是因为模块位置可预测的目录布局绝不是强制性的.以上示例的布局如下所示,这甚至有点普遍和可接受:
projects
|
+--scratch
| |
| +--scratch-parent
| | |
| | +--pom.xml [The POM of scratch:scratch:1.0-SNAPSHOT]
| |
| +--nipple
| | |
| | +--pom.xml [The POM of scratch:mod1:1.0-SNAPSHOT]
| |
| +--cabbage
| | |
| | +--pom.xml [The POM of scratch:mod2:1.0-SNAPSHOT]
Run Code Online (Sandbox Code Playgroud)
在这种情况下,<modules>父POM 的部分将是:
<modules>
<module>../nipple</module>
<module>../cabbage</module>
</modules>
Run Code Online (Sandbox Code Playgroud)
请注意,没有任何内容表明哪个模块中存在哪个工件ID.它只是告诉Maven这些是文件系统位置,在那里搜索与此构建相关的其他工件.
Ric*_*ler 25
我能想到你所希望的行为尚未实现的原因如下:
假设我正在研究A和B项目.目前A已被打破.如果依赖解析按照您的意愿发生,我将永远无法在A被修复之前构建B. 所以我要么必须将我的更改回滚到A,要么首先关注修复A. 无论哪种方式可能不是我现在想要关注的.
通常B想要使用A的"最后好"版本,而不是最新版本.使用存储库中的依赖项意味着它们至少编译好(并且希望单元测试也运行).
det*_*erb 14
看一下Maven reactor插件,特别是reactor:make,它构建了一个模块以及它所依赖的所有模块.
Rich是完全正确的.您所描述的通常不是预期的行为.虽然如Deterb所述,如果父POM知道模块,Maven反应器支持部分构建.
构建with 也mvn install -pl B -am应该使(-am)B的依赖(即A).
无论如何,模块A 必须是父POM的模块.
(参见Maven模块+构建单个特定模块)
如果你使用 IntelliJ,他们有一个小魔法复选框:在他们的 Maven 运行配置中“解析工作区工件”。因此无需从父级安装或构建。
| 归档时间: |
|
| 查看次数: |
80615 次 |
| 最近记录: |