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)配置文件

 

posted @ 2022-02-08 00:08  bjlhx15  阅读(2125)  评论(0编辑  收藏  举报
Copyright ©2011~2020 JD-李宏旭