我正在努力让Maven设置正常运行。我的项目布局很简单:
+
+--- libA
+--- libB
+--- projX
+--- projY
libA
和libB
(实际上,其中大约5个)是项目中的共享代码。 projX
和projY
(实际上,大约10个)是独立的应用程序,每个应用程序Main
。
我的要求很简单:
1)能够在Eclipse中运行projX和projY 2)使用单个命令编译projX和projY 的独立JAR(具有依赖性)每个 3)干
我目前的工作设置来自我的前任。它每个库有一个pom.xml
文件,这很好,但每个项目有两个pom.xml
个文件,但不是。其中一个甚至不compile
,但另一个需要compile assembly:single
。这两个文件几乎是彼此重复的,并且向项目添加新库需要在3-4个不同的地方进行更改。
我尝试过各种各样的事情。令人惊讶的是,在根中添加超级父pom.xml
是最简单的。这照顾了项目范围的设置,如UTF-8源文件编码等等。什么都行不通的是其他一切。除非进行某些修改,否则在POM之间无法引用彼此之间,拒绝编译源文件夹时,坚持使用永远空的本地存储库或者需要绝对路径,否则我无法满足我列出的要求。尽管阅读了官方文档并在网上搜索了例子,但这仍然存在。
有人可以帮忙吗?
答案 0 :(得分:1)
您需要3个pom.xml文件,一个用于父项目,一个用于每个子项目。您将有3个单独的项目。在父项目中,您将只拥有对子项目相同的jar的依赖项。例如。
父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>com.multimodule</groupId>
<artifactId>multimodule</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>model</module>
<module>presentation</module>
</modules>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
child 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.multimodule</groupId>
<artifactId>multimodule</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>presentation</artifactId>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>com.multimodule</groupId>
<artifactId>model</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
另一个孩子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.multimodule</groupId>
<artifactId>multimodule</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>model</artifactId>
</project>...
此示例用于Web应用程序,其中您具有单独的模型和表示层。可以通过Eclipse或Intellij Idea轻松创建多模块项目。
答案 1 :(得分:1)
通常情况下,Maven不应该太复杂。主要思想是将大部分冗余信息放在父级中(为简单起见,我们只使用一个父级),然后让子级模块引用父级。
这带来了将大部分“可配置”设置放在一个地方并限制冗余量的优势。
See this link for information regarding the different forms of inheritance in Maven
项目的结构应该是这样的:
+
pom.xml (root)
+--- libA
+--- src
+---main
+---java
+---resources
pom.xml
+--- libB
+--- src
+---main
+---java
+---resources
pom.xml
+--- projX
+--- src
+---main
+---java
+---resources
pom.xml
+--- projY
+--- src
+---main
+---java
+---resources
pom.xml
See this link regarding standard Maven layout
您将拥有3种类型的pom.xml(每个项目/库1个)
<?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>com.foo.bar</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<compiler.source>1.6</compiler.source>
<compiler.target>1.6</compiler.target>
<source.encoding>UTF-8</source.encoding>
<resource.encoding>UTF-8</resource.encoding>
</properties>
<modules>
<module>libA</module>
<module>projX</module>
</modules>
<dependencyManagement>
<dependencies>
<!-- Here put all the dependencies of all your project with groupId/artifactId/version-->
</dependencies>
</dependencyManagement>
<build>
<pluginManagement>
<!-- Here put all your plugins with groupId/artifactId/version and configuration -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${compiler.source}</source>
<target>${compiler.target}</target>
<encoding>${source.encoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.5</version>
<configuration>
<encoding>${resource.encoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.5.3</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>build-resources</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
<?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>
<parent>
<groupId>com.foo.bar</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>libA</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<!-- Here list all the actual dependencies but only groupId and artifactId
(versions are all put in the parent) -->
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
</dependency>
</dependencies>
</project>
<?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>
<parent>
<groupId>com.foo.bar</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>projX</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<!-- Here list all the actual dependencies but only groupId and artifactId (versions are all put in the parent) -->
<dependency>
<groupId>com.foo.bar</groupId>
<artifactId>libA</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
在这个配置中,maven-assembly被附加到阶段“package”,这意味着通过在根项目中调用mvn package
,您将一次性构建所有jar和jar-with-dependencies。 / p>