关于maven多module的依赖问题

之前的项目因为历史的原因,都是一个project里只包含了一个module,今年进入了新的项目组,出现了多个module,最近刚好也是在学《maven实战》因此想要将这个东西记录下来

工程情况如下图

示例的工程名为inaction

其中位于根目录的pom.xml内的代码如下

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0"
 3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 5     <modelVersion>4.0.0</modelVersion>
 6 
 7     <groupId>com.example</groupId>
 8     <artifactId>inaction</artifactId>
 9     <packaging>pom</packaging>
10     <version>1.0-SNAPSHOT</version>
11 
12     <modules>
13         <module>inactionuser</module>
14         <module>inactioncore</module>
15         <module>inactionparent</module>
16     </modules>
17 
18 </project>

因为是多module,所以必然是有自己编写的类或接口,是可以放在公共的module里的这里我把它命名为 inaction-core

然后有一个inaction-user表示用户模块的

一般的,如果我们需要将本地一些代码抽取到公共模块,那么还需要一个module来进行管理,在我的项目中,这个为 inaction-parent

记得要设置<realtivePath>../pom.xml</realtivePath>

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0"
 3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 5 
 6     <modelVersion>4.0.0</modelVersion>
 7 
 8     <groupId>com.example</groupId>
 9     <artifactId>inaction-parent</artifactId>
10     <version>1.0-SNAPSHOT</version>
11 
12     <!-- dependmanager不会向子类真的导入依赖,只是起到一个约束的作用 -->
13     <dependencyManagement>
14         <dependencies>
15             <!-- 这里声明本地公共的module -->
16             <dependency>
17                 <groupId>com.example</groupId>
18                 <artifactId>inaction-core</artifactId>
19                 <version>1.0-SNAPSHOT</version>
20             </dependency>
21         </dependencies>
22     </dependencyManagement>
23 
24 </project>

再看core和user 两个module

(ps 在paren头结点下,记得补充 <relativePath>../inactionparent/pom.xml</relativePath>)

<?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>
        <groupId>com.example</groupId>
        <artifactId>inaction-parent</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>inaction-user</artifactId>
    <packaging>jar</packaging>


    <dependencies>
        <!--注意到这里我们已经不需要声明版本了,因为在parent那边已经对版本进行了管理-->
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>inaction-core</artifactId>
        </dependency>
    </dependencies>
</project>

core模块就很简单,只需要声明其父module即可

<?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>
        <groupId>com.example</groupId>
        <artifactId>inaction-parent</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <packaging>jar</packaging>

    <artifactId>inaction-core</artifactId>


</project>

然后,在user模块中去引用core的类就不会有编译问题了

如果多module没有引用本地的module,那么可以不需要parent,直接声明到根目录下

注意,你的root,parent和公共的module,一定不要有 maven plugin,尤其是公共的module,会导致在 mvn clean install 的时候,报找不到类的错误

原文地址:https://www.cnblogs.com/westlin/p/10908778.html