需要澄清maven概要文件中资源定义的影响吗
在Maven多模块项目中,结构如下:需要澄清maven概要文件中资源定义的影响吗,maven,resources,profile,multi-module,Maven,Resources,Profile,Multi Module,在Maven多模块项目中,结构如下: P // parent project * A // first module * B // second module, containing the test in question ${JAVA_HOME}/lib/rt.jar:./B/target/test-classes :~/.m2/repository/junit/junit/4.11/junit-4.11.jar :~/.m2/repository/log4j/log4j/1.2.
P // parent project
* A // first module
* B // second module, containing the test in question
${JAVA_HOME}/lib/rt.jar:./B/target/test-classes
:~/.m2/repository/junit/junit/4.11/junit-4.11.jar
:~/.m2/repository/log4j/log4j/1.2.16/log4j-1.2.16.jar
:./A/target/A-1.0-SNAPSHOT.jar:./B/target/classes
的pom.xml
包含以下内容:
<profile>
<id>theProfile</id>
<build>
<resources>
<resource>
<directory>src/main/ctx/someDir</directory>
<filtering>true</filtering>
</resource>
<resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
<build>
</profile>
公司
src/main/ctx/someDir
真的
src/main/resources
当运行完整的项目p并激活此配置文件时,src/test/resources
作为类路径的一部分在B的测试期间是否以任何方式受到影响
如果是,以何种方式,以及如何更改定义,以使给定的资源
a) 纯粹附加的
b) 仅影响在其中定义它们的
如果否,则
src/main/resources
部分是否多余?简短回答:否,否
项目A中的资源将在流程资源阶段复制到A/target/classes
。配置文件所做的唯一一件事就是将更多资源复制到target/classes
。也就是说,它还将从src/main/ctx/someDir
复制(并过滤)文件
B的测试类路径保持不变。假设B依赖于A,那么它的测试类路径将包括A.jar,其中将包括A/target/classes的内容。您可以使用mvn依赖项:buildclasspath
检查这一点。但是,尽管类路径相同,但类的类路径条目的内容将不同
我不知道你为什么提到src/test/resource
(我假设你键入了src/test/resources
)。使用
元素单独管理测试资源。如果您的意思是A/src/test/resources
,那么不,它们不会出现在B的测试类路径中。如果您的意思是B/src/test/resources
,那么是的,它们将出现在B的测试类路径中。因此,激活配置文件不会对其产生任何影响
指定
src/main/resources
并非多余。如果要包含
元素,那么它需要包含项目中包含资源的所有目录。简短回答:否和否
项目A中的资源将在流程资源阶段复制到A/target/classes
。配置文件所做的唯一一件事就是将更多资源复制到target/classes
。也就是说,它还将从src/main/ctx/someDir
复制(并过滤)文件
B的测试类路径保持不变。假设B依赖于A,那么它的测试类路径将包括A.jar,其中将包括A/target/classes的内容。您可以使用mvn依赖项:buildclasspath
检查这一点。但是,尽管类路径相同,但类的类路径条目的内容将不同
我不知道你为什么提到src/test/resource
(我假设你键入了src/test/resources
)。使用
元素单独管理测试资源。如果您的意思是A/src/test/resources
,那么不,它们不会出现在B的测试类路径中。如果您的意思是B/src/test/resources
,那么是的,它们将出现在B的测试类路径中。因此,激活配置文件不会对其产生任何影响
指定src/main/resources
并非多余。如果要包含
元素,则需要包含项目中包含资源的所有目录。TL;(A)没有;B) 没有;如果您的
是
,那么您可以省略它,但正如所写的,没有
长话短说
如果从根目录运行构建,并假设B依赖于A
得到的类路径取决于整个反应器前进到的阶段
当阶段在生命周期的包
阶段之前时,类路径将引用${project.build.outputDirectory}
目录以查找反应器中的依赖项
当阶段在生命周期的包
阶段上或之后时,类路径将引用构造的JAR文件,例如${project.build.directory}/${project.build.finalName}.JAR
因此,给你一些具体的例子:
$ mvn compile
这在p中没有任何作用,因为p是一个pom
,默认情况下,打包不会将任何[classpath相关]插件绑定到安装之前的生命周期阶段
当我们点击A时,它将在编译类路径中列出A的所有依赖项,因为这些依赖项都不来自反应器,它们将从本地缓存(即~/.m2/repository
)解析,因此如果A使用log4j,您将有一个编译类路径,如
${JAVA_HOME}/lib/rt.jar:~/.m2/repository/log4j/log4j/1.2.16/log4j-1.2.16.jar
我们没有指定编译后的阶段,因此不会调用需要测试类路径的插件,因此此时不相关
现在我们转到B。B的依赖项包括A,因此它将引用A的主要工件(因为jar:jar
尚未运行,它将指向A的${project.build.outputDirectory}
)B的编译类路径看起来有点像这样
${JAVA_HOME}/lib/rt.jar:~/.m2/repository/log4j/log4j/1.2.16/log4j-1.2.16.jar
:./A/target/classes
${JAVA_HOME}/lib/rt.jar:./A/target/test-classes:~/.m2/repository/junit/junit/4.10/junit-4.10.jar
:~/.m2/repository/log4j/log4j/1.2.16/log4j-1.2.16.jar:./A/target/classes
${JAVA_HOME}/lib/rt.jar:~/.m2/repository/log4j/log4j/1.2.16/log4j-1.2.16.jar
:./A/target/A-1.0-SNAPSHOT.jar:./B/target/classes
:~/.m2/repository/junit/junit/4.11/junit-4.11.jar
[注意:当我们从p目录调用时,当前目录是p的${basedir}
所以B的${basedir}
值将是/B
]
尽管B自己的依赖项可能会根据其pom中依赖项的顺序以及是否对可传递依赖项应用排除或版本覆盖来改变类路径
嗯。这很简单,让我们开始。。。接下来,我们将生命周期向上移动到测试
阶段
$ mvn test
p的故事和以前一样
A的编译故事与以前相同。当我们进入测试编译
阶段时,将使用以下类路径编译测试(假设使用junit进行测试)
[我可能对元素的排序有点错误,因为我需要深入研究mvn-X来确认,但原则是正确的]
当我们进行测试时<
${JAVA_HOME}/lib/rt.jar:./B/target/test-classes
:~/.m2/repository/junit/junit/4.11/junit-4.11.jar
:~/.m2/repository/log4j/log4j/1.2.16/log4j-1.2.16.jar
:./A/target/classes:./B/target/classes
$ mvn package
${JAVA_HOME}/lib/rt.jar:~/.m2/repository/log4j/log4j/1.2.16/log4j-1.2.16.jar
:./A/target/A-1.0-SNAPSHOT.jar
${JAVA_HOME}/lib/rt.jar:~/.m2/repository/log4j/log4j/1.2.16/log4j-1.2.16.jar
:./A/target/A-1.0-SNAPSHOT.jar:./B/target/classes
:~/.m2/repository/junit/junit/4.11/junit-4.11.jar
${JAVA_HOME}/lib/rt.jar:./B/target/test-classes
:~/.m2/repository/junit/junit/4.11/junit-4.11.jar
:~/.m2/repository/log4j/log4j/1.2.16/log4j-1.2.16.jar
:./A/target/A-1.0-SNAPSHOT.jar:./B/target/classes
$ mvn install -DskipTests
$ mvn test -f B/pom.xmml
${JAVA_HOME}/lib/rt.jar:./B/target/test-classes
:~/.m2/repository/junit/junit/4.11/junit-4.11.jar
:~/.m2/repository/log4j/log4j/1.2.16/log4j-1.2.16.jar
:~/.m2/repository/com/mydomain/myproject/A/1.0-SNAPSHOT/A-1.0-SNAPSHOT.jar
:./B/target/classes
$ mvn package -PtheProfile
$ mvn clean install -PtheProfile -DskipTests
$ mvn test -f B/pom.xml
$ mvn clean install -DskipTests
$ mvn test -f B/pom.xml