我想为Java标准项目配置Maven POM,我想设计以下模块架构:
Parent
项目:此项目构建所有子模块。JAR
项目:此项目会创建最终的JAR文件。Core
项目:这是一个主要项目,但会有类似的项目。Libs
项目:这是一个项目,其中包含将由各种主要模块(例如Core
)使用的所有库依赖项。当我引用我在Project-Libs
的依赖项中定义的库时,我有一个编译Core模块的问题。
(在以下特定示例中,当我在Core
类测试中导入JUnit库时出现编译错误。)
我配置的Maven POM如下:
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.stackoverflow</groupId>
<artifactId>Project</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<modules>
<module>../Project-Libs</module>
<module>../Project-Core</module>
<module>../Project-JAR</module>
</modules>
Project-Libs
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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.stackoverflow</groupId>
<artifactId>Project</artifactId>
<version>1.0.0</version>
<relativePath>../Project</relativePath>
</parent>
<artifactId>Project-Libs</artifactId>
<packaging>pom</packaging>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
Project-Core
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.stackoverflow</groupId>
<artifactId>Project</artifactId>
<version>1.0.0</version>
<relativePath>../Project</relativePath>
</parent>
<artifactId>Project-Core</artifactId>
<packaging>jar</packaging>
<name>Project-Core</name>
<dependencies>
<dependency>
<groupId>com.stackoverflow</groupId>
<artifactId>Project-Libs</artifactId>
<version>1.0.0</version>
<type>pom</type>
</dependency>
</dependencies>
Project-JAR
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.stackoverflow</groupId>
<artifactId>Project</artifactId>
<version>1.0.0</version>
<relativePath>../Project</relativePath>
</parent>
<artifactId>Project-JAR</artifactId>
<packaging>jar</packaging>
<name>Project-JAR</name>
<dependencies>
<dependency>
<groupId>com.stackoverflow</groupId>
<artifactId>Project-Core</artifactId>
<version>1.0.0</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>com.stackoverflow</groupId>
<artifactId>Project-Libs</artifactId>
<version>1.0.0</version>
<type>pom</type>
</dependency>
</dependencies>
<build>
<plugins>
<!-- download source code in Eclipse, best practice -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.9</version>
<configuration>
<downloadSources>true</downloadSources>
<downloadJavadocs>false</downloadJavadocs>
</configuration>
</plugin>
<!-- Set a JDK compiler level -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArgument>-Xlint:all</compilerArgument>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<defaultLibBundleDir>lib</defaultLibBundleDir>
<modules>
<module>
<groupId>com.stackoverflow</groupId>
<artifactId>Project-Libs</artifactId>
</module>
<module>
<groupId>com.stackoverflow</groupId>
<artifactId>Project-Core</artifactId>
</module>
</modules>
<archive>
<manifest>
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
拜托,你能帮我解决和犯错吗?非常感谢。
答案 0 :(得分:0)
我放弃了这个Project-Libs
项目,因为显然只是为了保存其他项目的<dependency>
设置。这也可以在父Project
POM中完成。通过将这些依赖关系外包给一个单独的POM,您会错过父POM为您设计的内容:传递POM设置,例如: <dependencies>
,儿童项目。这样额外的Project-Libs
项目会不必要地使用<dependencies>
设置污染所有其他POM。
我设计了父Project
POM,如:
...
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
...
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
...
</dependencies>
...
从某个角度来看,从逻辑上讲,您Project-Libs
中声明的依赖关系并非由您的其他项目找到。 Project-Libs
不是父母,而是对他们的依赖。 Maven很好地处理了传递依赖,但我知道它也试图尽可能高效。现在,由于类型<packaging>pom
的项目不包含任何要编译,测试,打包,安装和部署的代码,因此可能会忽略此类项目中的依赖关系,无论是否存在任何过渡性由兄弟项目介绍。
您还可以为Project
父母提供BOM (bill of material) POM作为父母。
答案 1 :(得分:0)
您应该在父pom.xml文件中使用DependecyManagement。