一、idea中的build project
將項目中的的嗎編譯成字節碼,現在大部分項目使用的是springboot,如果沒有使用springboot特色插件功能可以使用
編譯項目,生成字節碼文件;
生成的target中有classes、generated-sources、generated-test-sources、test-classes目錄;
第一次點Build Project會編譯整個項目包括測試類,第二次點Build Project只會編譯修改的文件;(eg:刪除第一次編譯target中的User.class,第二次編譯時不會再生成User.class,因為User.java沒有修改。)
生成的target中沒有jar包;
generated-sources是在pom中配置maven插件,點擊Maven—Plugins—archetype:create-from-project可以生成源代碼的派生項目;
1.1、main方法啟動
默認沒有字節碼,需要編譯,此時會查看target是否有代碼,如果有直接運行,沒有的話調用上述編譯代碼
注意springboot中的main方法啟動也是如此
二、maven編譯打包
字節碼正常編譯,但是會使用到的pom中的插件,如果有對應的功能,就會生效
2.1、maven comile
編譯項目,生成字節碼文件;
生成的target中有classes、generated-sources、maven-status目錄;
每次都是重新編譯;(eg:刪除第一次編譯target中的Pig.class,第二次編譯時會再生成Pig.class,不論Pig.java有沒有修改。)
生成的target中沒有jar包;
maven-status目錄里面有createdFiles.lst和inputFiles,里面是全路徑字節碼文件和全路徑類文件;
2.2、Maven package
編譯項目,生成jar包;
生成的target中有classes、generated-sources、generated-test-sources、maven-archiver、maven-status、surefire-reports、test-classes、jar文件等目錄;
每次都是重新編譯打包;(eg:刪除第一次編譯target中的Bird.class,第二次編譯時會再生成Bird.class,不論Bird.java有沒有修改。)
生成的target中有jar包;
2.3、Maven install
將包打到本地倉庫;
2.4、Maven deploy
將包打到遠程倉庫;
2.5、擴展maven編譯打包:springboot-maven-plugin
一般springboot會默認使用如下配置
<build> <resources> <!-- 在application.yml中使用了@@讀取標簽值,報下面的錯誤--> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.4.0</version> <configuration> <!-- 本地jar--> <includeSystemScope>true</includeSystemScope> <mainClass>com.ApplicationChainMakerMain</mainClass> </configuration> <executions> <execution> <goals> <!-- 在springboot的Actuator上面看見構建信息--> <goal>build-info</goal> <!--重新打包--> <!-- 1、在原始Maven打包形成的jar包基礎上,進行重新打包,新形成的jar包不但包含應用類文件和配置文件,而且還會包含應用所依賴的jar包以及Springboot啟動相關類(loader等),以此來滿足Springboot獨立應用的特性; 2、將原始Maven打包的jar重命名為XXX.jar.original作為原始文件; --> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
作用一、增加resources配置主要是有些項目根據不同的環境產生不同的配置, 在pom中配置不同環境不同端口
<profiles> <profile> <id>local</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <server_port>8081</server_port> </profile> <profile> <id>dev</id> <properties> <server_port>8082</server_port> </properties> </profile> <profile> <id>prod</id> <properties> <server_port>8083</server_port> </properties> </profile> </profiles>
通過plugins中配置resources,可是程序在directory下配置的所有文件替換以“’@server_port@‘”或’“@server_port@”‘或“${server_port}”的變量;
故一般directory下配置:src/main/resource/*.properties這種限定一下文件類型,防止替換過多
2.6、spring-boot:run啟動
這個會調用maven的編譯打包
三、小結
1、普通Java的jar、war項目沒有使用pom特殊替換變量以及插件,直接使用main方法或者Tomcat啟動即可,使用默認Java會編譯、配置直接拷貝,沒有替換
2、使用了springboot的pom中的配置給項目中的配置,需要使用maven方式編譯打包,這時會替換變量;
如果自定義了插件,使用maven打包以及springboot:repackage是一樣的,springplugin的生命周期在maven中,會被調用;
這時編譯好后啟動使用main 與 springboot:run是一樣的,
如果調試過程中改了類文件,直接使用main方法直接運行是可以的,因為第一次點Build Project會編譯整個項目包括測試類,第二次點Build Project只會編譯修改的文件;
若果修改了配置,則需要重新執行maven compile。然后main 與run 均可
所以推薦springboot項目直接使用springboot:run。或者每次使用maven compile編譯main方法或者run運行
3.1、resources 常用配置
<resources> <!-- 在application.yml中使用了@@讀取標簽值,filter 替換,--> <!--將 resources 下的文件拷貝至 classpath下--> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> <!--將 resources 下的文件拷貝至 targetPath,排除掉一些二進制,為了容器化打包使用--> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <targetPath>../conf</targetPath> <excludes> <exclude>lib/*.*</exclude> <exclude>linux-x86-64/*.*</exclude> <exclude>win32-x86-64/*.*</exclude> </excludes> </resource> </resources>
3.2、配置生效順序
3.2.1、默認配置以及優先級
如果有springboot啟動會掃描一下位置的application.properties或者application.yml作為默認的配置文件
工程根目錄:./config/
工程根目錄:./
classpath:/config/ 【高優先級】
classpath:/
加載的優先級順序是從上向下加載,並且所有的文件都會被加載,高優先級的內容會覆蓋底優先級的內容,形成互補配置
也可以通過指定配置spring.config.location來改變默認配置,一般在項目已經打包后,我們可以通過指令:java -jar xxxx.jar --spring.config.location=D:/kawa/application.yml來加載外部的配置
如config下application.properties
server.port=8080
key1=value1
如./下application.properties
server.port=8090
key2=value2
實際加載的配置是
server.port=8080
key1=value1
key2=value2
3.2.2、外部配置
由外向內,高優先級的內容會覆蓋底優先級的內容,形成互補配置
2、優先加載帶profile
- jar包外部的application-{profile}.propertie或application.yml(帶spring.profile)配置文件
- jar包內部的application-{profile}.propertie或application.yml(帶spring.profile)配置文件
- jar包外部的application.propertie或application.yml(不帶spring.profile)配置文件
- jar包內部的application.propertie或application.yml(不帶spring.profile)配置文件