1. 程式人生 > >maven多模組專案打包war包或者jar包

maven多模組專案打包war包或者jar包

序言:

打包jar包:

jar包時springboot推薦的打包方式,這種型別的檔案直接java -jar 檔名 就可以直接執行。

  • 新增maven外掛:

    首先第一步在專案的pom.xml檔案中新增 maven外掛:

     <build>
         <plugins>
             <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
             </plugin>
         </plugins>
     </build>
    

    都知道要新增外掛,但關鍵在於新增在什麼地方。我們可以想一想,最終我們需要打包的檔案是什麼?是web專案,所以我們將maven外掛新增到web模組中(也就是除了根pom之外的,最頂級的模組pom檔案)。
    這裡給大家解釋下為什麼不能放在父pom.xml檔案中,首先我們來試一下放在父pom檔案中會出現什麼問題:

     [INFO] demo ............................................... SUCCESS [  1.615 s]
     [INFO] demo-dao ........................................... FAILURE [  2.496 s]
     [INFO] demo-service ....................................... SKIPPED
     [INFO] demo-web ........................................... SKIPPED
     [INFO] ------------------------------------------------------------------------
     [INFO] BUILD FAILURE
     [INFO] ------------------------------------------------------------------------
     [INFO] Total time: 4.845 s
     [INFO] Finished at: 2018-11-02T16:15:37+08:00
     [INFO] Final Memory: 37M/335M
     [INFO] ------------------------------------------------------------------------
     [ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.0.6.RELEASE:repackage (default) on project demo-dao: Execution default of goal org.springframework.boot:spring-boot-maven-plugin:2.0.6.RELEASE:repackage failed: Unable to find main class -> [Help 1]
    

    Unable to find main class
    在父pom中宣告外掛之後,子模組都會繼承外掛(dependencyManagementdependencies的區別)。所以在執行外掛時,dao模組、service模組都是沒有主函式,所以會報錯。針對這種情況,其實是有方法去解決的,這裡我就不介紹(其實是樓主不會。。。。。)

  • 執行哪個pom.xml 檔案:

    我都試了下,不管是web模組還是父模組都可以執行成功, 但我還是建議執行web模組中的pom進行打包。

  • 檔案在哪裡:

    檔案最終在 web模組中的target目錄下。

打包 war包:

  1. 父pom需要一些設定:

     <packaging>pom</packaging>
    
  2. web層新增maven外掛,並且設定打包為war包:

       <packaging>war</packaging>
       <build>
       	<plugins>
       		<plugin>
       			<groupId>org.springframework.boot</groupId>
       			<artifactId>spring-boot-maven-plugin</artifactId>
       		</plugin>
       	</plugins>
       </build>
    
  3. 依賴包作為jar包打包:

    其他模組中新增如下設定:

    <packaging>jar</packaging>
    
  4. 去除springboot 內建tomcat伺服器:

     <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
          <!-- 移除嵌入式tomcat外掛 -->
          <exclusions>
              <exclusion>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-tomcat</artifactId>
              </exclusion>
          </exclusions>
      </dependency>
    
  5. 加入tomcat支援:

     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-tomcat</artifactId>
         <scope>provided</scope>
     </dependency>
    
  6. 修改啟動類,將DemoApplication.java繼承SpringBootServletInitializer並重寫configure方法:

    @SpringBootApplication()
    @MapperScan("com.cj.demo.dao")
    public class DemoApplication  extends SpringBootServletInitializer {
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
            return builder.sources(DemoApplication.class);
        }
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class);
        }
    }
    
  7. 打包:

    不管在總pom或者web層都可以進行到打包。

    打包的war包都在web層的target檔案下。複製貼上到tomcat的webapps下啟動就可以訪問。

總結:

總體而言,maven分模組和maven不分模組進行打包基本沒什麼區別,jar包沒什麼好說的,都一樣的。war包也就是去除tomcat伺服器之類的配置,唯一需要注意的是在依賴的模組中需要加入<packaging>jar</packaging>配置。仔細想想也挺有道理的,我們先把依賴的模組打包成jar包,然後在web模組中進行引入,然後再進行使用。
下載地址:
demo-war