偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Maven 多模塊項(xiàng)目搭建指南

開發(fā)
使用maven構(gòu)建父子模塊,便于我們項(xiàng)目依賴和版本的管理,以下便是筆者整理的maven父子模塊搭建的一些注意事項(xiàng)以及兩種比較常見maven父子模塊搭建方案,希望對(duì)你有幫助。

近期在整理自己以前寫過(guò)的文章,偶然發(fā)現(xiàn)的maven系列,因?yàn)槲恼戮帉懙臅r(shí)期比較久遠(yuǎn),有些概念以及使用方式可能有些陳舊,所以筆者打算對(duì)此文章進(jìn)行重構(gòu),希望對(duì)你有幫助。

使用maven構(gòu)建父子模塊,便于我們項(xiàng)目依賴和版本的管理,以下便是筆者整理的maven父子模塊搭建的一些注意事項(xiàng)以及兩種比較常見maven父子模塊搭建方案,希望對(duì)你有幫助。

一、詳解不同級(jí)的父子模塊搭建

1. 基礎(chǔ)結(jié)構(gòu)搭建

不同層級(jí)的maven父子模塊搭建方式可讀性比較差,所以比較少見,多出現(xiàn)在一些比較老舊,且模塊劃分多的項(xiàng)目中。

接下來(lái)我們就來(lái)簡(jiǎn)單的演示一下非同級(jí)的maven父子模塊搭建過(guò)程,首先我們基于idea創(chuàng)建一個(gè)空的項(xiàng)目:

此時(shí)我們就得到一個(gè)全空的java項(xiàng)目包:

基于此項(xiàng)目包,我們點(diǎn)擊File->New->Module嘗試創(chuàng)建一個(gè)父模塊:

設(shè)置好模塊名稱并設(shè)定為maven項(xiàng)目后,點(diǎn)擊下一步:

此時(shí)我們的空項(xiàng)目中就多了一個(gè)maven模塊:

重點(diǎn)步驟來(lái)了,為了讓我們創(chuàng)建的這個(gè)模塊變?yōu)楦改K,我們必須進(jìn)行如下操作:

  • 父工程的 packaging 標(biāo)簽的文本內(nèi)容必須設(shè)置為 pom,即:  <packaging>pom</packaging>。
  • 刪除src文件夾,讓這個(gè)項(xiàng)目完全作為父模塊管理maven父子工程。

2. 創(chuàng)建同級(jí)子模塊

同樣的我們點(diǎn)擊File->New->Module創(chuàng)建模塊:

將子模塊路徑與父模塊設(shè)置為同級(jí),并讓parent指向maven-parent由此構(gòu)成一個(gè)同級(jí)父子模塊架構(gòu):

自此我們的子模塊也創(chuàng)建完成了,可以看到其parent指向了我們的父模塊,可以看出子模塊自動(dòng)生成了父模塊的坐標(biāo)以及父pom文件的相對(duì)地址:

<?xml versinotallow="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:schemaLocatinotallow="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <!--        父模塊的坐標(biāo)-->
        <groupId>org.example</groupId>
        <artifactId>maven-parent</artifactId>
        <version>1.0-SNAPSHOT</version>
        <!-- 父pom相對(duì)路徑-->
        <relativePath>../maven-parent/pom.xml</relativePath>
    </parent>

    <!--    子模塊名稱-->
    <artifactId>test-module-1</artifactId>


</project>

3. 父子模塊通用配置

通過(guò)在 File | Settings | Build, Execution, Deployment | Compiler | Java Compiler查看maven模塊,我們的父模塊默認(rèn)級(jí)別為1.5,對(duì)此我們不妨通過(guò)pom配置讓保證后續(xù)所有模塊的級(jí)別都是1.8:

所以我們可以在父pom中聲明如下配置指明編譯版本和編碼格式:

<build>
        <plugins>
            <!--            編譯插件-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <!--                插件版本號(hào)-->
                <version>3.8.1</version>
                <!--                設(shè)置編譯級(jí)別和編碼格式-->
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>

此時(shí)查看配置就可以看到所有的項(xiàng)目版本都變?yōu)閖dk1.8:

4. 父子模塊的依賴管理

默認(rèn)情況下,我們通過(guò)如下所示的依賴配置標(biāo)簽在父模塊引入依賴后,子模塊也會(huì)同步引入相關(guān)依賴:

<dependencies>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.18</version>
        </dependency>
    </dependencies>

如下圖,可以看到我們?cè)诟竝om中引入hutool后,子模塊也引入了相關(guān)依賴,這種做法子模塊會(huì)無(wú)條件繼承父工程的所有依賴,導(dǎo)致本不需要的繼承的依賴也會(huì)被繼承,這就大大增加了項(xiàng)目模塊最終打包的大小,也可能為上線埋下了隱患(例如某些自動(dòng)裝配的腳手架)。

而解決方式也比較簡(jiǎn)單,在父pom依賴配置的外部添加dependencyManagement標(biāo)簽,使得這些依賴都視為聲明和版本標(biāo)注,并不會(huì)實(shí)際引入:

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>cn.hutool</groupId>
                <artifactId>hutool-all</artifactId>
                <version>5.8.18</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

經(jīng)過(guò)dependencyManagement標(biāo)注之后,父子模塊就不會(huì)引入hutool依賴了:

后續(xù)子模塊如果需要引入hutool,也只需引入依賴的組號(hào)和組名即可:

<dependencies>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
        </dependency>
    </dependencies>

二、詳解帶有層級(jí)的父子模塊搭建

1. 層級(jí)式父子模塊簡(jiǎn)介

這種方式是筆者比較常用的一種方式,該結(jié)構(gòu)會(huì)有著嚴(yán)格的父子層級(jí),無(wú)論是在管理還是在模塊管理上都非常直觀。這種結(jié)構(gòu)在各大開源項(xiàng)目中都非常常見,例如阿里的nacos,可以看到它就是典型的層級(jí)式maven父子模塊:

2. 層級(jí)式maven父子模塊初始化

層級(jí)式父子模塊搭建步驟比較簡(jiǎn)單,我們首先指明程序類型為maven創(chuàng)建一個(gè)常規(guī)的maven項(xiàng)目:

同理指明打包方式并將src文件夾刪除即可完成基礎(chǔ)架構(gòu)搭建:

3. 添加子模塊

后續(xù)的子模塊創(chuàng)建我們只需通過(guò)File|New|Module指明子模塊對(duì)應(yīng)父模塊及其路徑,以筆者的演示項(xiàng)目為例,可以看到筆者指明子模塊路徑在項(xiàng)目根目錄,同時(shí)指定parent指定父模塊:

此時(shí)查看父pom就會(huì)看到多了一個(gè)子模塊:

<?xml versinotallow="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:schemaLocatinotallow="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <!--略-->

    <packaging>pom</packaging>
    <modules>
        <module>test-module</module>
    </modules>

   <!--略-->

</project>

對(duì)應(yīng)的子模塊也會(huì)指明父模塊的坐標(biāo):

需要補(bǔ)充的是,maven父子模塊是可以無(wú)限嵌套的,這也就意味著我們的test-module一樣可以作為父模塊添加子模塊,如下筆者在test-module添加了test-module-001:

4. 模塊間的互用

如下圖,筆者創(chuàng)建了兩個(gè)子模塊,對(duì)應(yīng)的模塊2想使用模塊1中的user類,要如何做到呢?

首先自然是聲明,我們需要在父pom文件下聲明test-module的gav信息:

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.example</groupId>
                <artifactId>test-module</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

然后在test-module-2下即可直接無(wú)版本號(hào)引入:

<dependencies>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>test-module</artifactId>
        </dependency>
    </dependencies>

這樣一來(lái),我們就可以直接在模塊2中使用模塊1的User類了:

三、父子模塊常見問(wèn)題與解析

1. 多環(huán)境配置是什么,有什么作用

日常開發(fā)過(guò)程中,我們的應(yīng)用需要在多個(gè)環(huán)境下進(jìn)行部署測(cè)試。例如在日常開發(fā)時(shí),我們希望每個(gè)依賴的應(yīng)用都是使用快照版,然后發(fā)布出去時(shí)希望應(yīng)用的依賴是發(fā)布版。如下圖,我們希望同一套應(yīng)用可以根據(jù)使用環(huán)境的不同,將應(yīng)用設(shè)置為不同的版本:

對(duì)此我們不妨編寫一個(gè)示例演示一下,首先我們創(chuàng)建一個(gè)maven父子項(xiàng)目,結(jié)構(gòu)如下圖所示:

我們希望在開發(fā)環(huán)境子模塊son所依賴的junit是4.1.2版本。到了生產(chǎn)環(huán)境junit是4.1.3。對(duì)此我們就需要對(duì)同一個(gè)依賴配置不同版本。

所以我們的首先需要在父pom依賴管理配置中加上junit

dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

重點(diǎn)步驟來(lái)了,若為開發(fā)環(huán)境,junit配置為4.1.2,配置內(nèi)容如下所示,id設(shè)置為dev,聲明一個(gè)junit-version標(biāo)簽,指定配置版本為4.1.2,意為開發(fā)環(huán)境junit版本為4.1.2

<profiles>
        <profile>
            <!--聲明id為dev代表下面的配置是給開發(fā)環(huán)境使用的-->
            <id>dev</id>
            <activation>
                <jdk>[1.8,)</jdk>
            </activation>
            <properties>
                <maven.javadoc.failOnError>false</maven.javadoc.failOnError>
                <maven.javadoc.quiet>true</maven.javadoc.quiet>
                <!--若為開發(fā)環(huán)境則使用4.1.2-->
                <junit.version>4.12</junit.version>

            </properties>
        </profile>
        <profile>
            <id>release</id>
            <properties>
                <maven.javadoc.quite>true</maven.javadoc.quite>
                <maven.javadoc.skip>false</maven.javadoc.skip>
            </properties>
        </profile>
    </profiles>

同理生產(chǎn)環(huán)境配置如下:

<properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <module.install.skip>false</module.install.skip>
        <module.deploy.skip>false</module.deploy.skip>
        <module.spm.skip>true</module.spm.skip>
        <maven.javadoc.skip>true</maven.javadoc.skip>
        <module.test.skip>true</module.test.skip>
        <module.vue.skip>false</module.vue.skip>

        <junit.version>4.13</junit.version>
    </properties>

完整的父pom配置以及注釋:

<?xml versinotallow="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:schemaLocatinotallow="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.test.maven</groupId>
    <artifactId>testDev</artifactId>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>son</module>
    </modules>

    <packaging>pom</packaging>


    <profiles>
        <profile>
            <!--聲明id為dev代表下面的配置是給開發(fā)環(huán)境使用的-->
            <id>dev</id>
            <activation>
                <jdk>[1.8,)</jdk>
            </activation>
            <properties>
                <maven.javadoc.failOnError>false</maven.javadoc.failOnError>
                <maven.javadoc.quiet>true</maven.javadoc.quiet>
                <!--若為開發(fā)環(huán)境則使用4.1.2-->
                <junit-version>4.12</junit-version>

            </properties>
        </profile>
        <profile>
            <id>release</id>
            <properties>
                <maven.javadoc.quite>true</maven.javadoc.quite>
                <maven.javadoc.skip>false</maven.javadoc.skip>
            </properties>
        </profile>
    </profiles>

    <!--生產(chǎn)環(huán)境配置-->
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <module.install.skip>false</module.install.skip>
        <module.deploy.skip>false</module.deploy.skip>
        <module.spm.skip>true</module.spm.skip>
        <maven.javadoc.skip>true</maven.javadoc.skip>
        <module.test.skip>true</module.test.skip>
        <module.vue.skip>false</module.vue.skip>
        <junit.version>4.13</junit.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>


</project>

然后我們的son模塊只需引入junit依賴即可,配置如下:

<dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

這時(shí)候我們就會(huì)看到我們開發(fā)環(huán)境的junit版本為4.1.2:

2. 多環(huán)境配置工作流程

不難從maven設(shè)計(jì)者的角度考慮到多環(huán)境配置的工作流程,當(dāng)我們環(huán)境配置了多個(gè)環(huán)境時(shí),難免會(huì)出現(xiàn)環(huán)境依賴配置不一致的問(wèn)題。例如我們開發(fā)環(huán)境沒(méi)有配置junit版本,maven意識(shí)到這個(gè)問(wèn)題,他就會(huì)去生產(chǎn)環(huán)境的版本中讀取配置,這就是為什么筆者在上文配置的過(guò)程中生產(chǎn)環(huán)境配置沒(méi)有加id的原因。

可以看到筆者將開發(fā)環(huán)境junit版本注釋后,junit版本就會(huì)變成生產(chǎn)環(huán)境的4.1.3

四、遇到過(guò)的問(wèn)題與解決思路

之所以筆者會(huì)提出上述的工作流程,正是因?yàn)殚_發(fā)時(shí)遇到了生產(chǎn)環(huán)境無(wú)法導(dǎo)入依賴的問(wèn)題,因?yàn)榍叭伺渲靡蕾嚢姹緯r(shí),將版本號(hào)標(biāo)簽配置錯(cuò)誤,導(dǎo)致導(dǎo)入依賴時(shí)用了生產(chǎn)環(huán)境的配置進(jìn)而出現(xiàn)意外的錯(cuò)誤。沿用上文的例子,可能就是將開發(fā)環(huán)境的junit.version寫成了junit-version,如下圖所示:

所以我們每當(dāng)遇到這種環(huán)境問(wèn)題時(shí),需要分析每個(gè)管理工具的工作流程,從工作流程角度推算出可能會(huì)出現(xiàn)問(wèn)題的地方,以及這種粗心的錯(cuò)誤,我們可能需要使用cv大法進(jìn)行文本比對(duì)。例如筆者上文所出現(xiàn)的問(wèn)題,我們首先就需要從maven導(dǎo)入依賴流程中推斷問(wèn)題所在,就上文的現(xiàn)象,我們從maven工作流程可以推斷出問(wèn)題出現(xiàn)的地方可能是:

  • maven開發(fā)環(huán)境配置版本錯(cuò)誤
  • maven開發(fā)環(huán)境配置沒(méi)有配置對(duì)應(yīng)版本的配置信息
  • 標(biāo)簽配置錯(cuò)誤,讀取了默認(rèn)配置
責(zé)任編輯:趙寧寧 來(lái)源: 寫代碼的SharkChili
相關(guān)推薦

2022-12-30 08:17:28

Gradle多模塊項(xiàng)目

2011-08-23 09:35:23

MavenJava

2021-01-11 09:17:49

GitLabCIMonorepoDocker

2020-03-24 14:55:48

Spring Boot多模塊Java

2009-06-17 17:02:22

2010-07-26 17:09:00

Perl模塊

2010-04-03 11:30:15

Widget開發(fā)

2009-12-16 13:53:51

Ruby多繼承

2025-01-07 08:28:22

2020-11-05 10:40:07

Spring Boot多模塊Java

2021-01-14 11:05:41

項(xiàng)目配置屬性

2012-05-18 10:08:56

TitaniumAndroid

2011-09-15 16:33:25

2025-05-26 08:05:00

Nacos源碼開發(fā)

2012-04-10 10:11:40

軟件項(xiàng)目

2021-11-11 12:05:17

Python代碼項(xiàng)目

2014-05-20 10:09:54

Intellij IDMaven Web

2025-08-27 01:28:00

MavenIDEA插件

2024-11-25 08:00:00

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)