成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Maven 多模塊項目搭建指南

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

近期在整理自己以前寫過的文章,偶然發現的maven系列,因為文章編寫的時期比較久遠,有些概念以及使用方式可能有些陳舊,所以筆者打算對此文章進行重構,希望對你有幫助。

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

一、詳解不同級的父子模塊搭建

1. 基礎結構搭建

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

接下來我們就來簡單的演示一下非同級的maven父子模塊搭建過程,首先我們基于idea創建一個空的項目:

此時我們就得到一個全空的java項目包:

基于此項目包,我們點擊File->New->Module嘗試創建一個父模塊:

設置好模塊名稱并設定為maven項目后,點擊下一步:

此時我們的空項目中就多了一個maven模塊:

重點步驟來了,為了讓我們創建的這個模塊變為父模塊,我們必須進行如下操作:

  • 父工程的 packaging 標簽的文本內容必須設置為 pom,即:  <packaging>pom</packaging>。
  • 刪除src文件夾,讓這個項目完全作為父模塊管理maven父子工程。

2. 創建同級子模塊

同樣的我們點擊File->New->Module創建模塊:

將子模塊路徑與父模塊設置為同級,并讓parent指向maven-parent由此構成一個同級父子模塊架構:

自此我們的子模塊也創建完成了,可以看到其parent指向了我們的父模塊,可以看出子模塊自動生成了父模塊的坐標以及父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>
    <parent>
        <!--        父模塊的坐標-->
        <groupId>org.example</groupId>
        <artifactId>maven-parent</artifactId>
        <version>1.0-SNAPSHOT</version>
        <!-- 父pom相對路徑-->
        <relativePath>../maven-parent/pom.xml</relativePath>
    </parent>

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


</project>

3. 父子模塊通用配置

通過在 File | Settings | Build, Execution, Deployment | Compiler | Java Compiler查看maven模塊,我們的父模塊默認級別為1.5,對此我們不妨通過pom配置讓保證后續所有模塊的級別都是1.8:

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

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

此時查看配置就可以看到所有的項目版本都變為jdk1.8:

4. 父子模塊的依賴管理

默認情況下,我們通過如下所示的依賴配置標簽在父模塊引入依賴后,子模塊也會同步引入相關依賴:

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

如下圖,可以看到我們在父pom中引入hutool后,子模塊也引入了相關依賴,這種做法子模塊會無條件繼承父工程的所有依賴,導致本不需要的繼承的依賴也會被繼承,這就大大增加了項目模塊最終打包的大小,也可能為上線埋下了隱患(例如某些自動裝配的腳手架)。

而解決方式也比較簡單,在父pom依賴配置的外部添加dependencyManagement標簽,使得這些依賴都視為聲明和版本標注,并不會實際引入:

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

經過dependencyManagement標注之后,父子模塊就不會引入hutool依賴了:

后續子模塊如果需要引入hutool,也只需引入依賴的組號和組名即可:

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

二、詳解帶有層級的父子模塊搭建

1. 層級式父子模塊簡介

這種方式是筆者比較常用的一種方式,該結構會有著嚴格的父子層級,無論是在管理還是在模塊管理上都非常直觀。這種結構在各大開源項目中都非常常見,例如阿里的nacos,可以看到它就是典型的層級式maven父子模塊:

2. 層級式maven父子模塊初始化

層級式父子模塊搭建步驟比較簡單,我們首先指明程序類型為maven創建一個常規的maven項目:

同理指明打包方式并將src文件夾刪除即可完成基礎架構搭建:

3. 添加子模塊

后續的子模塊創建我們只需通過File|New|Module指明子模塊對應父模塊及其路徑,以筆者的演示項目為例,可以看到筆者指明子模塊路徑在項目根目錄,同時指定parent指定父模塊:

此時查看父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>

    <!--略-->

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

   <!--略-->

</project>

對應的子模塊也會指明父模塊的坐標:

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

4. 模塊間的互用

如下圖,筆者創建了兩個子模塊,對應的模塊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下即可直接無版本號引入:

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

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

三、父子模塊常見問題與解析

1. 多環境配置是什么,有什么作用

日常開發過程中,我們的應用需要在多個環境下進行部署測試。例如在日常開發時,我們希望每個依賴的應用都是使用快照版,然后發布出去時希望應用的依賴是發布版。如下圖,我們希望同一套應用可以根據使用環境的不同,將應用設置為不同的版本:

對此我們不妨編寫一個示例演示一下,首先我們創建一個maven父子項目,結構如下圖所示:

我們希望在開發環境子模塊son所依賴的junit是4.1.2版本。到了生產環境junit是4.1.3。對此我們就需要對同一個依賴配置不同版本。

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

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

重點步驟來了,若為開發環境,junit配置為4.1.2,配置內容如下所示,id設置為dev,聲明一個junit-version標簽,指定配置版本為4.1.2,意為開發環境junit版本為4.1.2

<profiles>
        <profile>
            <!--聲明id為dev代表下面的配置是給開發環境使用的-->
            <id>dev</id>
            <activation>
                <jdk>[1.8,)</jdk>
            </activation>
            <properties>
                <maven.javadoc.failOnError>false</maven.javadoc.failOnError>
                <maven.javadoc.quiet>true</maven.javadoc.quiet>
                <!--若為開發環境則使用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>

同理生產環境配置如下:

<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代表下面的配置是給開發環境使用的-->
            <id>dev</id>
            <activation>
                <jdk>[1.8,)</jdk>
            </activation>
            <properties>
                <maven.javadoc.failOnError>false</maven.javadoc.failOnError>
                <maven.javadoc.quiet>true</maven.javadoc.quiet>
                <!--若為開發環境則使用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>

    <!--生產環境配置-->
    <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>

這時候我們就會看到我們開發環境的junit版本為4.1.2:

2. 多環境配置工作流程

不難從maven設計者的角度考慮到多環境配置的工作流程,當我們環境配置了多個環境時,難免會出現環境依賴配置不一致的問題。例如我們開發環境沒有配置junit版本,maven意識到這個問題,他就會去生產環境的版本中讀取配置,這就是為什么筆者在上文配置的過程中生產環境配置沒有加id的原因。

可以看到筆者將開發環境junit版本注釋后,junit版本就會變成生產環境的4.1.3

四、遇到過的問題與解決思路

之所以筆者會提出上述的工作流程,正是因為開發時遇到了生產環境無法導入依賴的問題,因為前人配置依賴版本時,將版本號標簽配置錯誤,導致導入依賴時用了生產環境的配置進而出現意外的錯誤。沿用上文的例子,可能就是將開發環境的junit.version寫成了junit-version,如下圖所示:

所以我們每當遇到這種環境問題時,需要分析每個管理工具的工作流程,從工作流程角度推算出可能會出現問題的地方,以及這種粗心的錯誤,我們可能需要使用cv大法進行文本比對。例如筆者上文所出現的問題,我們首先就需要從maven導入依賴流程中推斷問題所在,就上文的現象,我們從maven工作流程可以推斷出問題出現的地方可能是:

  • maven開發環境配置版本錯誤
  • maven開發環境配置沒有配置對應版本的配置信息
  • 標簽配置錯誤,讀取了默認配置
責任編輯:趙寧寧 來源: 寫代碼的SharkChili
相關推薦

2022-12-30 08:17:28

Gradle多模塊項目

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開發

2025-01-07 08:28:22

2009-12-16 13:53:51

Ruby多繼承

2020-11-05 10:40:07

Spring Boot多模塊Java

2021-01-14 11:05:41

項目配置屬性

2012-05-18 10:08:56

TitaniumAndroid

2011-09-15 16:33:25

2025-05-26 08:05:00

Nacos源碼開發

2012-04-10 10:11:40

軟件項目

2021-11-11 12:05:17

Python代碼項目

2014-05-20 10:09:54

Intellij IDMaven Web

2024-05-07 12:00:47

決策分析模型數據

2024-11-25 08:00:00

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品久久av | 懂色av一区二区三区在线播放 | 99国产精品99久久久久久粉嫩 | 日本网站免费观看 | 国产成人99久久亚洲综合精品 | 91国产视频在线观看 | 91精品国产一区二区在线观看 | 日韩视频中文字幕 | 又黑又粗又长的欧美一区 | 米奇狠狠鲁 | 黄色精品| 欧美日韩国产在线观看 | 性做久久久久久免费观看欧美 | 久久久99国产精品免费 | 国产免费一级片 | 韩国欧洲一级毛片 | 亚洲精品免费视频 | 亚洲成人久久久 | www日本高清 | 日本高清视频在线播放 | 一区中文字幕 | 综合一区二区三区 | 精品一区二区三区免费毛片 | 日韩中文字幕一区 | 国产精品久久久久久久久久软件 | 日韩一区二区三区在线观看 | 久久久久久99 | 久草视频网站 | 极品在线 | 色播久久 | 久久久www成人免费无遮挡大片 | 日韩欧美国产精品一区 | 亚洲欧洲一区 | 国产在线一级片 | 欧美综合国产精品久久丁香 | 欧美一二三 | 午夜小电影 | 国产成人99久久亚洲综合精品 | 午夜精品久久久久久 | av黄色在线播放 | 亚洲嫩草 |