• 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)配置文件
  • 相关阅读:
    vue中根据手机类型判断是安卓、微信或IOS跳转相应下载页面
    冒泡排序、数组去重
    vue2中component父子组件传递数据props的使用
    filter 在CSS用的效果
    纪念一下——做事要踏实
    要先学会做人,再做事
    2014再见,2013你好!
    --initialize specified but the data directory has files in it. Aborting. 解决
    Unity 发生 System.TypeInitializationException: “”的类型初始值设定项引发异常。的错误
    C#和delphi交互传结构体的delphi接收不到问题
  • 原文地址:https://www.cnblogs.com/bjlhx/p/15869873.html
Copyright © 2020-2023  润新知