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、外部配置
由外向内,高优先级的内容会覆盖底优先级的内容,形成互补配置
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)配置文件