idea-編譯調試運行程序buildproject與maven


一、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、外部配置

由外向內,高優先級的內容會覆蓋底優先級的內容,形成互補配置

1、命令行參數:比如:java -jar xxxx.jar --server.port=8087 --server.context-path=/show 多個配置中間用空格分開

2、優先加載帶profile

  • jar包外部的application-{profile}.propertie或application.yml(帶spring.profile)配置文件
  • jar包內部的application-{profile}.propertie或application.yml(帶spring.profile)配置文件

3、再來加載不帶profile
  • jar包外部的application.propertie或application.yml(不帶spring.profile)配置文件
  • jar包內部的application.propertie或application.yml(不帶spring.profile)配置文件

 


免責聲明!

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



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