Idea基于Maven配置多JDK版本

Idea基于Maven配置多JDK版本1. 配置settings.xml2. 配置pom.xml3. 配置project structure3.1 配置SDK3.2 检查Modules相应SDK配置4. 配置Maven插件4.1 Maven基本配置4.2 配置Maven运行的JDK5. 配置编译JDK6. 编译打包6.1 使用Maven插件6.2 使用命令Idea基于Maven配置多JDK版本如果在本地开发环境中安装了多个JDK版本的话,需要在idea中自由切换,就需要利用Maven进行配置,配置后就可以非常方便的进行版本切换。配置步骤如下:1. 配置settings.xml在Maven的本地配置中,添加以下配置,配置JAVA_HOME和JAVA_VERSION两个属性。<profiles> <profile> <id>java6-compiler</id> <properties> <JAVA_HOME>C:\SoftCommon\Java\jdk1.6.0_45</JAVA_HOME> <JAVA_VERSION>1.6</JAVA_VERSION> </properties> </profile> <profile> <id>java7-compiler</id> <properties> <JAVA_HOME>C:\SoftCommon\Java\jdk1.7.0_67</JAVA_HOME> <JAVA_VERSION>1.7</JAVA_VERSION> </properties> </profile> <profile> <id>java8-compiler</id> <properties> <JAVA_HOME>C:\SoftCommon\Java\jdk1.8.0_202</JAVA_HOME> <JAVA_VERSION>1.8</JAVA_VERSION> </properties> <!– activeByDefault=true代表如果不指定某个固定id的profile,那么就使用这个环境 –> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> <profile> <id>java9-compiler</id> <properties> <JAVA_HOME>C:\SoftCommon\Java\jdk-9</JAVA_HOME> <JAVA_VERSION>1.9</JAVA_VERSION> </properties> </profile> <profile> <id>java11-compiler</id> <properties> <JAVA_HOME>C:\SoftCommon\Java\jdk-11.0.2</JAVA_HOME> <JAVA_VERSION>11</JAVA_VERSION> </properties> </profile></profiles>2. 配置pom.xml在相应的项目工程中配置pom.xml中配置如下,主要是添加一个build标签,添加maven-compiler-plugin编译插件。<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.home>${JAVA_HOME}</java.home> <java.version>${JAVA_VERSION}</java.version> <maven.compiler.source>${JAVA_VERSION}</maven.compiler.source> <maven.compiler.target>${JAVA_VERSION}</maven.compiler.target></properties><build> <!–pluginmanagement标签一般用在父pom中,子元素可以包含plugins插件–> <pluginManagement> <plugins> <!– 一个好习惯,就是在此配置JDK的版本,这样就可以方便代码迁移 By Landy 2019.01.04–> <!–一般而言,target与source是保持一致的。但是,有时候为了让程序能在其他版本的jdk中运行(对于低版本目标jdk,源代码中需要没有使用低版本jdk中不支持的语法),会存在target不同于source的情况 。–> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> <configuration> <source>${maven.compiler.source}</source> <!– 源代码使用的开发版本 –> <target>${maven.compiler.target}</target> <!– 需要生成的目标class文件的编译版本 –> <!– 这下面的是可选项 –> <meminitial>128m</meminitial> <maxmem>512m</maxmem> <fork>true</fork> <!– fork is enable,用于明确表示编译版本配置的可用 –> <compilerVersion>${java.version}</compilerVersion> <!– 这个选项用来传递编译器自身不包含但是却支持的参数选项 –> <!–<compilerArgument>-verbose -bootclasspath ${java.home}\lib\rt.jar</compilerArgument>–> <executable>${java.home}/bin/javac</executable> </configuration> </plugin> </plugins> </pluginManagement></build>注意:pluginmanagement主要是用于父工程(module),然后在相应的子工程(module)中添加如下配置即可加入maven-compiler-plugin插件,这样就可以让子工程决定是否加载相应的Maven插件。<build> <!–然后,在子pom文件中就可以这样使用,省去了版本、配置等信息,只需指定groupId和artifactId即可。–> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> </plugin> </plugins></build>以上配置详情可以参看本例项目配置。配置完成刷新一下Maven插件(reimport),即可展示上面所配置的profile列表。如下所示:3. 配置project structure3.1 配置SDK打开idea中的project structure,配置相应的project sdk和project language level,配置如下(本案例采用JDK11),3.2 检查Modules相应SDK配置在Modules中有可能会没能自动刷新相应的sdk language level配置,这时候就需要手动设置。注意:经过本人现场测试,发现idea 2018.03版本的情况,他只能自动刷新的language level是JDK1.8+的版本。操作方法:点击Maven插件中的reimport,如下所示,4. 配置Maven插件4.1 Maven基本配置在Idea中需要配置一下Maven settings.xml文件和Maven本地仓库的位置,如果有本地安装的Maven也可以进行配置(没有则使用idea默认自带的Maven)。file –> settings –> maven 如下所示:4.2 配置Maven运行的JDK为了每次切换了Project JDK后,不需要再次进行设置可以选择Project JDK选项。如下所示,5. 配置编译JDK这时候,一般情况下,经过上面步骤,基本上就就可以进行相应的maven编译打包的操作了,但是有时候会遇到如下的问题,Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile (default-compile) on project xxxx Fatal error compiling: 无效的标记: -parameters -> [Help 1]这个错误是由于你项目所需jdk版本和你当前使用的jdk版本不一致导致的,因为我项目的pom.xml中定义了java版本为11,但是我实际idea中run这个项目却是1.8.要是你在intellij idea里面的maven窗口点击的打包编译的话,就在intellij idea设置项目jdk版本,直接Ctrl+Alt+s进入设置界面。6. 编译打包通过以上步骤就可以利用maven进行编译打包的操作了。6.1 使用Maven插件如果使用idea,则可以直接使用maven插件进行打包操作。如下图所示,6.2 使用命令如果使用Maven命令,如下所示,mvn -s D:\mvn_repository\settings.xml clean package -P java11-compilerjava11-compiler即为上面配置的jdk版本的profile id,并且需要制定相应的settings文件即可。关于本人笔者Github链接: https://github.com/landy8530 ...

March 30, 2019 · 1 min · jiezi

配置SpringBoot方便的切换jar和war

配置SpringBoot方便的切换jar和war网上关于如何切换,其实说的很明确,本文主要通过profile进行快速切换已实现在不同场合下,用不同的打包方式。jar到war修改步骤pom文件修改packaging配置由jar改为war排除tomcat等容器的依赖配置web.xml或者无web.xml打包处理入口类修改添加ServletInitializer特别注意:当改成war包的时候,application.properties配置的server.port和server.servlet.context-path就无效了,遵从war容器的安排。配置pom配置packaging<packaging>${pom.package}</packaging>修改build<!– 作用是打war包的时候,不带版本号 –><finalName>${pom.packageName}</finalName><!–加入plugin–><plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.2.2</version> <configuration> <!–如果想在没有web.xml文件的情况下构建WAR,请设置为false。–> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration></plugin>排除容器<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions></dependency>配置profile<profiles> <profile> <!– 开发环境 –> <id>jar</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <pom.package>jar</pom.package> <pom.packageName>${project.artifactId}-${project.version}</pom.packageName> <pom.profiles.active>dev</pom.profiles.active> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </dependency> </dependencies> </profile> <profile> <id>war</id> <properties> <pom.package>war</pom.package> <pom.packageName>${project.artifactId}</pom.packageName> <pom.profiles.active>linux</pom.profiles.active> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> </dependencies> </profile></profiles>修改入口类入口类继承SpringBootServletInitializer重写configure方法使用@Profile注解,当启用war配置的时候,初始化Servlet。public class Application extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Profile(value = {“war”}) @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(Application.class); }} ...

January 17, 2019 · 1 min · jiezi

Profile配置和加载配置文件

Profile配置1.Profile是什么很多时候,我们项目在开发环境和生成环境的环境配置是不一样的,例如,数据库配置,在开发的时候,我们一般用测试数据库,而在生产环境的时候,我们是用正式的数据,这时候,我们可以利用profile在不同的环境下配置用不同的配置文件或者不同的配置。spring boot允许你通过命名约定按照一定的格式(application-{profile}.properties)来定义多个配置文件,然后通过在application.properyies通过spring.profiles.active来具体激活一个或者多个配置文件,如果没有没有指定任何profile的配置文件的话,spring boot默认会启动application-default.properties。2.基于properties文件类型假如有开发、测试、生产三个不同的环境,需要定义三个不同环境下的配置。你可以另外建立3个环境下的配置文件:applcation.propertiesapplication-dev.propertiesapplication-test.propertiesapplication-prod.properties然后在applcation.properties文件中指定当前的环境: spring.profiles.active=test这时候读取的就是application-test.properties文件。server.port=8001# 激活哪个配置文件spring.profiles.active=devspring.profiles.include=prod可以包含其他的配置文件信息3.基于yml文件类型只需要一个applcation.yml文件就能搞定,推荐此方式。spring: profiles: active: prod—spring: profiles: dev server: port: 8080 —spring: profiles: test server: port: 8081 —spring.profiles: prodspring.profiles.include: - proddb - prodmq server: port: 8082 —spring: profiles: proddb db: name: mysql —spring: profiles: prodmq mq: address: localhost此时读取的就是prod的配置,prod包含proddb,prodmq,此时可以读取proddb,prodmq下的配置也可以同时激活三个配置spring.profiles.active: prod,proddb,prodmq3.基于Java代码在JAVA配置代码中也可以加不同Profile下定义不同的配置文件,@Profile注解只能组合使用@Configuration和@Component注解。@Configuration@Profile(“prod”)public class ProductionConfiguration { // …}4.指定Profile不适用配置文件,而是在启动的时候进行指定的写法4.1 main方法启动方式:// 在IDE Arguments里面添加–spring.profiles.active=prod优先级高于在配置文件里面的激活的4.2 JVM启动方式-Dspring.profiles.active=dev4.3 插件启动方式spring-boot:run -Drun.profiles=prod4.4 jar运行方式java -jar xx.jar –spring.profiles.active=prod除了在配置文件和命令行中指定Profile,还可以在启动类中写死指定,通过SpringApplication.setAdditionalProfiles方法public void setAdditionalProfiles(String… profiles) { this.additionalProfiles = new LinkedHashSet<String>(Arrays.asList(profiles));}配置文件加载位置spring boot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件:file:./config/ - 优先级最高(项目根路径下的config)file:./ - 优先级第二 -(项目根路径下)classpath:/config/ - 优先级第三(项目resources/config下)classpath:/ - 优先级第四(项目resources根目录)重要的规则,跟我们之前学过的不太一样高优先级配置会覆盖低优先级配置多个配置文件互补比如,两个同名文件里面有相同的配置,相同的配置会被高优先级的配置覆盖A配置优先级大于B配置server: port: 8080B配置优先级小于A配置server: port: 8081 context-path: /hanpang项目启动后访问地址为:http://127.0.0.1:8080/hanpang,这就是所谓的互补通过配置spring.config.location来改变默认配置java -jar demo-xxx.jar –spring.config.location=C:/application.properties这对于运维来说非常方便,在不破坏原配置情况下轻松修改少量配置就可以达到想要的效果外部配置加载顺序来自于网路,个人没有进行相关的测试SpringBoot也可以从以下位置加载配置:优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置。命令行参数所有的配置都可以在命令行上进行指定;多个配置用空格分开; –配置项=值java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar –server.port=8087 –server.context-path=/abc来自java:comp/env的JNDI属性Java系统属性(System.getProperties())操作系统环境变量RandomValuePropertySource配置的random.*属性值jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件.jar包外部的application.properties或application.yml(不带spring.profile)配置文件jar包内部的application.properties或application.yml(不带spring.profile)配置文件由jar包外向jar包内进行寻找,优先加载待profile的,再加载不带profile的。@Configuration注解类上的@PropertySource通过SpringApplication.setDefaultProperties指定的默认属性加载配置文件方式参考官网地址 ...

December 25, 2018 · 1 min · jiezi