Maven創建多模塊項目(包括依賴版本號的統一更新)


0、多項目工程的文件夾及依賴關系

bus-core-api為公共項目,app-web-ui依賴bus-core-api,app-desktop-ui依賴bus-core-api

1、創建一個父Maven工程

mvn archetype:generate -DgroupId=com.jsoft.test -DartifactId=testproject -Dversion=1.0-SNAPSHOT -DarchetypeGroupId=org.codehaus.mojo.archetypes -DarchetypeArtifactId=pom-root -DinteractiveMode=false -DarchetypeVersion=RELEASE

注意:此項目為pom類型的工程,創建好之后只有一個pom.xml文件,<packaging>類型為pom。

創建好后的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.jsoft.test</groupId>
  <artifactId>testproject</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>
  <name>testproject</name>
</project>

2、創建三個子Maven工程

注意:此時創建的工程的目錄是進去父Maven工程的目錄進行創建

①創建bus-core-api項目

mvn archetype:generate -DgroupId=com.jsoft.test -DartifactId=bus-core-api -Dversion=1.0-SNAPSHOT -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false -DarchetypeVersion=RELEASE

②創建app-desktop-ui項目

mvn archetype:generate -DgroupId=com.jsoft.test -DartifactId=app-desktop-ui -Dversion=1.0-SNAPSHOT -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false -DarchetypeVersion=RELEASE

③創建app-web-ui項目

mvn archetype:generate -DgroupId=com.jsoft.test -DartifactId=app-web-ui -Dversion=1.0-SNAPSHOT -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false -DarchetypeVersion=RELEASE

此時創建好項目之后,父Maven工程pom.xml也會跟着改變,自動加入<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">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.jsoft.test</groupId>
  <artifactId>testproject</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>
  <name>testproject</name>
  <modules> <module>bus-core-api</module> <module>app-desktop-ui</module> <module>app-web-ui</module> </modules>
</project>

而通過進入到父Maven工程的目錄創建的子Maven工程,pom.xml也會做相應的變化,增加了<parent>節點,內容如下:

bus-core-api:

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent> <groupId>com.jsoft.test</groupId> <artifactId>testproject</artifactId> <version>1.0-SNAPSHOT</version> </parent>
  <groupId>com.jsoft.test</groupId>
  <artifactId>bus-core-api</artifactId>
  <version>1.0-SNAPSHOT</version>
  <name>bus-core-api</name>
  <url>http://maven.apache.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

app-desktop-ui:

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent> <groupId>com.jsoft.test</groupId> <artifactId>testproject</artifactId> <version>1.0-SNAPSHOT</version> </parent>
  <groupId>com.jsoft.test</groupId>
  <artifactId>app-desktop-ui</artifactId>
  <version>1.0-SNAPSHOT</version>
  <name>app-desktop-ui</name>
  <url>http://maven.apache.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

app-web-ui:

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent> <groupId>com.jsoft.test</groupId> <artifactId>testproject</artifactId> <version>1.0-SNAPSHOT</version> </parent>
  <groupId>com.jsoft.test</groupId>
  <artifactId>app-web-ui</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>
  <name>app-web-ui Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
    <finalName>app-web-ui</finalName>
  </build>
</project>

而此時項目還沒有完工,因為bus-core-api為公共項目,app-web-ui依賴bus-core-api,app-desktop-ui依賴bus-core-api,所以必須在app-web-ui和app-desktop-ui增加對bus-core-api的依賴引用。修改后的pom.xml如下:

app-desktop-ui:

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.jsoft.test</groupId>
    <artifactId>testproject</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <groupId>com.jsoft.test</groupId>
  <artifactId>app-desktop-ui</artifactId>
  <version>1.0-SNAPSHOT</version>
  <name>app-desktop-ui</name>
  <url>http://maven.apache.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>   <groupId>com.jsoft.test</groupId>   <artifactId>bus-core-api</artifactId>   <version>1.0-SNAPSHOT</version> </dependency>
  </dependencies>
</project>

app-web-ui:

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.jsoft.test</groupId>
    <artifactId>testproject</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <groupId>com.jsoft.test</groupId>
  <artifactId>app-web-ui</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>
  <name>app-web-ui Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>   <groupId>com.jsoft.test</groupId>   <artifactId>bus-core-api</artifactId>   <version>1.0-SNAPSHOT</version> </dependency>
  </dependencies>
  <build>
    <finalName>app-web-ui</finalName>
  </build>
</project>

可以看出,每個項目上都需要增加對bus-core-api的依賴,而且這個依賴需要寫上<version>節點,上面就已經寫上了1.0-SNAPSHOT。

接下來測試依賴是否成功,先進入父Maven項目的目錄,然后進行打包mvn package

打包完成后,打開app-web-ui.war包,查看WEB-INF\lib\目錄下是否有bus-core-api-1.0-SNAPSHOT.jar的引用。

如上所示已經成功引用。

至此,使用Maven新建多模塊項目的過程就已經完成了。

 

參考:

http://stackoverflow.com/questions/6328778/how-to-create-an-empty-multi-module-maven-project

https://maven.apache.org/pom.html#Aggregation

 

測試工程:https://github.com/easonjim/5_java_example/tree/master/maventest/test9/testproject

 

但是,可能會有一個疑問,比如說我bus-core-api這個項目在下面兩個項目上的依賴,當bus-core-api更新版本號時,難道app-web-ui和app-desktop-ui項目上的pom.xml文件的<version>也要做相應的更改嗎?完全要自己手動去修改嗎?

經過研究可以通過下面方法實現:

1、在父Maven項目定義一個屬性<properties>叫做<projectVersion>,然后每個項目的<version>節點都引用這個變量${projectVersion},包括依賴上的<version>都使用這個。那么當更新版本時手動修改一處地方即可。雖然解決了大量工作,但是小量的修改還是可以接受的。

2、也許能行,通過maven-release-plugin插件實現,參考:http://maven.apache.org/maven-release/maven-release-plugin/examples/update-versions.html

3、終極解決方法,使用versions-maven-plugin插件,官網:http://www.mojohaus.org/versions-maven-plugin/index.html

當使用此插件在父Maven項目testproject時,運行如下命令將更新全部項目的版本號,包括子項目之間的依賴也都同步更新:

mvn versions:set -DnewVersion=2.0-SNAPSHOT

當進入到子Maven項目bus-core-api時,運行如下命令將更新全部項目對bus-core-api項目引用的版本號:

mvn versions:set -DnewVersion=2.1-SNAPSHOT

當更改版本號時有問題,可以通過以下命令進行版本號回滾:

mvn versions:revert

如果一切都沒有問題,那就直接提交版本號:

mvn versions:commit

通過這個插件就可以對特定項目更新版本號時,其它與它有關聯的項目都可以一並更新。

其它使用方法,參考:http://www.mojohaus.org/versions-maven-plugin/plugin-info.html

還有使用此插件需要注意的,比如自己手動修改了某個文件的版本號,那么這樣通過這個插件去更新時是更新不到的,因為匹配不上手動修改的版本號。如果要使其生效,就必須更改成統一的版本號。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM