關於idea對javaweb項目的編譯打包配置
基於maven的javaweb目錄結構
如果你創建的maven項目的目錄比我標出來的少,按照我展示的目錄結構新增文件結構即可。
|--- pom.xml
|--- web
|--- META-INF
|--- WEB-INF
|--- web.xml
|--- src
|--- main
|--- java
|--- package(com.mz)
|--- controller
|--- service
|--- serviceImpl
|--- mapper
|--- entity
|--- utils
|--- config
|--- source
|--- 各種資源文件,最終會被編譯到classes目錄
|--- test
|--- java
|--- package(com.mz)
idea javaweb的編譯設置說明
如果不是springboot項目,那麼需要依賴外部的tomcat來啓動併發布項目。
步驟有三個:
- 配置idea編譯javaweb項目。
- 配置idea編譯並且生成產品artifact。
- 將artifact發佈到外部的tomcat。
配置idea編譯javaweb項目
步驟:右鍵項目,點擊Project structure。這個就是配置idea爲項目進行編譯以及生成打包文件配置的地方。(mac的idea,project structure在菜單File中)
-
Project概念
- idea中的project,並不是代表當前項目的意思,而是表示項目空間,是多個項目的集合。相當於eclipse的workspace。
- project中用於指定所有項目的jdk版本,以及所有項目編譯文件輸出目錄。
- project中只用於配置jdk版本即可。當然你會發現有個橙色的out目錄,是由這裏的配置生成的。
-
Modules概念 – 掌管當前項目中的所有編譯配置
- modules就是配置本項目的位置。new Module或者import module就是導入一個項目進來進行配置。
- 你對當前項目中的所有編譯配置(項目編譯成class文件)都在modules中。看上圖’spring-test’表示當前項目。‘web’表示這是個javaweb項目。
- 點擊‘spring-test’, sources用於指定項目中的文件目錄代表何種資源。比如藍色的sources表示該目錄是源碼文件,目錄中的java文件會被編譯成class字節碼文件。綠色的tests表示是單元測試文件。Resources表示是項目依賴的資源文件,會被拷貝到編譯後的classes目錄下。Excluded表示這個目錄不需要處理。
- 點擊‘spring-test’,Paths用於配置編譯後的文件位置,這裏僅僅指定項目編譯文件的輸出目錄。就是項目編譯運行時,會出現一個橙色目錄Target的原因。這裏的paths設置不會影響項目的打包以及發佈。就是說項目出現的部署錯誤,跟這裏絕對沒關係。生成後的target目錄也是可以刪除的
- 點擊‘spring-test’,Dependencies目錄表示本項目依賴的第三方庫。一般maven的項目會自動導入。如果是本地的jar包,可以點擊+進行導入。
- 點擊’Web’, 這裏是對本項目的web配置,Deployment Descriptors用於指定web.xml的位置。 Web resource Directories擁有指定javaweb的web目錄。
-
Libraries 概念
這裏是Modules中的Paths的配置,建議在modules中配置即可。
-
Facets 概念
這裏是對Module中Web的配置,建議在modules中配置即可。
-
Artifacts 概念
這裏就是對編譯後的文件打包的配置。如果沒有artifact,點擊+號,然後選擇exploded(表示可以直接在toomcat運行的文件目錄,即war包在tomcat解壓的目錄)。 如果是要打成war包,選擇Archive。- 這裏需要注意 ‘Output directory’,/Users/mengze/Desktop/spring-test/out/artifacts/spring_test_war_exploded這個就是 打包文件的目錄。
- 關於WEB-INF, classes, lib,以及 web facet都不用更改。 其中WEB-INF就是javaweb項目中根目錄中的WEB-INF, classes表示編譯後的java文件目錄。 lib表示jar庫文件目錄。web facet表示web目錄下的文件。
配置idea編譯並且生成產品artifact
Artifacts上其實點擊+號就能正確生成。不過說明下目錄的作用
|--- WBE-INF
|--- classes
|--- xxx compile output 這裏存放被sources標記的文件編譯目錄。只有被編譯的文件纔會被編譯並且放到這個文件中。sources中如果有xml等資源文件,是不會被複制到classes中的。如果sources中存在資源文件,可以使用maven預編譯進行資源文件複製配置。
|--- lib 這個是第三方庫的目錄。maven引入的庫自動導入到其中。如果有依賴本地的jar包,可以在lib中查看是否已經導入。
|--- facet resources 這是是項目源碼中對應的web目錄下的資源文件,比如index。html, web.xml, jsp目錄等。編譯到項目的WEB-INF目錄下。
將artifact發佈到外部的tomcat
點擊Unamed,點擊Edit Configurations。
將本地tomcat與當前項目的發佈包Artifacts進行綁定的位置就是Deployment, 點擊+號,然後選擇 exploded就行。這樣發佈包的部署就設置完成。
另外,注意Application Context, 表示訪問的上下文。 比如設置 /root , 那麼訪問接口就變成了 http://localhost:8080/root/xxxx 。
關於Configuration Error: deployment source ‘xxx:war exploded’ is not valid錯誤 分析
上面對編譯,打包,部署在idea中的配置位置都做了說明。
- 錯誤的介紹:
部署的資源包是無效(不可用)的。
- 下面來分析錯誤能出現的原因以及位置。
- 原因1:編譯階段的問題 ==> java源程序編譯不過去。導致沒有生成Artifacts,所以部署就會報 ‘war不可用’。這個是代碼問題 或者
project structure中 modules
配置問題 - 原因2:打包階段的問題 ==> 沒有在project structure中的Artifacts中去配置 exploded,根本就沒有生成artifact。這個是’project structure中 artifacts’配置問題
- 原因3:發佈階段的問題 ==> 雖然正確生成了artifact,但是Edit configuration中的deployment沒有與該artifa綁定。 這個是Edit Configurations中deployment的配置問題
- 還補充一個新手容易出現的問題。雖然不是上面的問題,但是會在正確部署沒有報錯之後,依然404的問題。
- 使用springmvc時,有些人會配置(比如我)攔截所有的請求,然後發現訪問localhost:8080訪問不到index.html文件。以及訪問第一個@requestMapping(“/hello”)對應的接口時,也出現了404,因爲處理器方法返回的string,是對應的/WEB-INF/jsp/下的success.jsp文件,因爲沒有創建success.jsp文件而報錯。
- 原因1:編譯階段的問題 ==> java源程序編譯不過去。導致沒有生成Artifacts,所以部署就會報 ‘war不可用’。這個是代碼問題 或者