1 问题描述

由于在工作中,经常需要把项目制作成war包,然后部署到容器中,而在IDEA中可以很方便的直接调试,便有了如下的两种情形

  1. 在开发过程中,不需要频繁的部署到远程容器中,而需要不断的通过Debug调试自己的程序。
  2. 而在开发调试到了一定阶段,又要直接把项目制作成war包,部署到远程容器
    之前遇到一种情形,由于POM中为制作war包,需要修改POM,并移除Tomcat,并且要修改启动类具体过程参见配置SpringBoot方便的切换jar和war,Springboot项目(包含第三方jar包)打成war包方法,Springboot项目(包含第三方jar包)打成jar包方法。
    从jar包调试到war包部署,然后再从war包部署到jar包调试,总是要频繁的修改POM,那么有没有一种方式,可以避免修改POM,以一种类似profile多环境的方式,可以在执行mvn命令时通过指定参数(Profile)的形式自动切换呢?

2 POM修改

内容参见配置SpringBoot方便的切换jar和war

2.1 主要修改对象为POM

2.1.1pom文件修改

packaging配置由jar改为war

<packaging>${pom.package}</packaging>

排除tomcat等容器的依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><!--移除嵌入式tomcat插件--><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions></dependency>

修改build

<build><finalName>ROOT</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>1.8</source><target>1.8</target><skip>true</skip><encoding>UTF-8</encoding></configuration></plugin><!--加入plugin--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.1.0</version><configuration><!--如果想在没有web.xml文件的情况下构建WAR,请设置为false。--><failOnMissingWebXml>false</failOnMissingWebXml></configuration></plugin></plugins></build>

配置profile

<profiles><profile><!-- 开发环境 --><id>jar</id><activation><activeByDefault>true</activeByDefault></activation><properties><pom.package>jar</pom.package></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><version>2.0.1.RELEASE</version></dependency></dependencies></profile><profile><id>war</id><properties><pom.package>war</pom.package></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><version>2.0.1.RELEASE</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency></dependencies></profile></profiles>

2.1.2 入口类修改

添加ServletInitializer

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Profile;/*** 启动类** @Owner: SongQuanHeng* @Time: 2019/6/11-14:24* @Version:* @Change:*/
@SpringBootApplication
@ComponentScan(value = {"com.example.profile"})
public class App extends SpringBootServletInitializer  {public static void main(String[] args) {SpringApplication.run(App.class, args);System.out.println("程序启动成功");}@Profile(value = {"war"})@Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder application){return application.sources(App.class);}
}

2.2 完整的POM

完整的POM对象如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.1.RELEASE</version><relativePath/><!-- lookup parent from repository --></parent><!-- mvn dependency:sources -DdownloadSources=true -DdownloadJavadocs=true --><groupId>com.example</groupId><artifactId>profile</artifactId><version>1.3-SNAPSHOT</version><name>profile</name><packaging>${pom.package}</packaging><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- https://mvnrepository.com/artifact/org.apache.maven/maven-plugin-api --><dependency><groupId>org.apache.maven</groupId><artifactId>maven-plugin-api</artifactId><version>3.5.0</version></dependency><!-- https://mvnrepository.com/artifact/org.codehaus.cargo/cargo-maven2-plugin --><dependency><groupId>org.codehaus.cargo</groupId><artifactId>cargo-maven2-plugin</artifactId><version>1.7.6</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><!--移除嵌入式tomcat插件--><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency></dependencies><repositories><repository><id>nexus</id><name>Nexus3</name><url>http://localhost:8081/repository/maven-central/</url><snapshots><enabled>false</enabled></snapshots><releases><enabled>true</enabled></releases></repository></repositories><distributionManagement><repository><id>nexus-release</id><name>Local Nexus Repository</name><url>http://localhost:8081/repository/maven-releases/</url></repository><snapshotRepository><id>nexus-snapshot</id><name>Local Nexus Repository</name><url>http://localhost:8081/repository/maven-snapshots/</url></snapshotRepository></distributionManagement><properties><java.version>1.8</java.version></properties><build><finalName>ROOT</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>1.8</source><target>1.8</target><skip>true</skip><encoding>UTF-8</encoding></configuration></plugin><!--加入plugin--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.1.0</version><configuration><!--如果想在没有web.xml文件的情况下构建WAR,请设置为false。--><failOnMissingWebXml>false</failOnMissingWebXml></configuration></plugin></plugins></build><profiles><profile><!-- 开发环境 --><id>jar</id><activation><activeByDefault>true</activeByDefault></activation><properties><pom.package>jar</pom.package></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><version>2.0.1.RELEASE</version></dependency></dependencies></profile><profile><id>war</id><properties><pom.package>war</pom.package></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><version>2.0.1.RELEASE</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency></dependencies></profile></profiles></project>

3 POM使用

3.1 IDEA直接调试

3.2 IDEA制作war包

3.2.1 选择profile制作war包


控制台打印如下:

"C:\Program Files\Java\jdk1.8.0_131\bin\java" -Dmaven.multiModuleProjectDirectory=D:\600-Git\profile\profile "-Dmaven.home=C:\Program Files\apache-maven-3.5.4" "-Dclassworlds.conf=C:\Program Files\apache-maven-3.5.4\bin\m2.conf" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2018.1\lib\idea_rt.jar=53936:C:\Program Files\JetBrains\IntelliJ IDEA 2018.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\apache-maven-3.5.4\boot\plexus-classworlds-2.5.2.jar" org.codehaus.classworlds.Launcher -Didea.version=2018.1 -s C:\Users\lenovo\.m2\settings.xml package -f pom.xml -P war
[INFO] Scanning for projects...
[WARNING]
[WARNING] Some problems were encountered while building the effective model for com.example:profile:war:1.3-SNAPSHOT
[WARNING] 'dependencies.dependency.(groupId:artifactId:type:classifier)' must be unique: org.springframework.boot:spring-boot-starter-web:jar -> duplicate declaration of version (?) @ line 52, column 15
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]
[INFO]
[INFO] ------------------------< com.example:profile >-------------------------
[INFO] Building profile 1.3-SNAPSHOT
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:3.0.1:resources (default-resources) @ profile ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 4 resources
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ profile ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 3 source files to D:\600-Git\profile\profile\target\classes
[INFO]
[INFO] --- maven-resources-plugin:3.0.1:testResources (default-testResources) @ profile ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory D:\600-Git\profile\profile\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ profile ---
[INFO] Not compiling test sources
[INFO]
[INFO] --- maven-surefire-plugin:2.21.0:test (default-test) @ profile ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-war-plugin:3.1.0:war (default-war) @ profile ---
[INFO] Packaging webapp
[INFO] Assembling webapp [profile] in [D:\600-Git\profile\profile\target\ROOT]
[INFO] Processing war project
[INFO] Webapp assembled in [3895 msecs]
[INFO] Building war: D:\600-Git\profile\profile\target\ROOT.war
[INFO]
[INFO] --- spring-boot-maven-plugin:2.0.1.RELEASE:repackage (default) @ profile ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 55.344 s
[INFO] Finished at: 2019-08-24T15:37:08+08:00
[INFO] ------------------------------------------------------------------------Process finished with exit code 0

3.2.2 拷贝war到webapps

在演示时,使用Tomcat容器来进行war正常工作

拷贝ROOT.war到Tomcat的webapps目录下
执行bin目录下的startup.bat

特别注意:当改成war包的时候,application.properties配置的server.port和server.servlet.context-path就无效了,遵从war容器的安排。
上述执行图示也说明了该问题。虽然在application.properties中指定了端口为8086,但实际项目运行时,使用的端口为8080

3.2.3 Postman测试

3总结

上述的过程就是通过在POM中添加profiles的方式,通过外部命令指定profile的方式灵活的生成war包和jar包,并且方便快速的在IDEA中调试的过程。

工作在于积累和提高效率,如果一个问题,你可以在第一次解决的时候把解决的过程记录下来,那么下次当你遇到相同的问题,能够使问题快速得到解决,那么这就是成长。

关于态度,当领导突然给你一个任务时,千万不要顺口就反对和排斥,工作时应该抱持的态度是开放,而不是抵制,所以先不要急着反对,而是静下来,当你遇到相同的情境时,没有张口就反对,那么这就是成长。

看电视剧《全职高手》,昨天兴欣战队失利,叶修千机伞被毁,团队成员都变得失落,沮丧,吃饭时大家相互推诿责任,彼此指责,这个时候不要也随着自己的情绪而相互职责,而是静下来承受,因为只有做的不好的时候,才会出现抱怨彼此,不妨静下来,不让自己陷入抱怨别人的情境中,就算被别人抱怨,也别急着反击,而是承担下来,增加自己的心量,让自己的胸怀更加宽广,我一直相信,一个人胸怀有多大,就会有多大的前景,所以无论是工作,还是生活,都最好不要抱怨和牢骚,因为抱怨和牢骚对于破冰毫无益处,而只会拉低自己的能量状态,不如好好反思检讨。

4 代码下载

Git地址

Maven在POM中使用profile方便的切换war和jar的制作相关推荐

  1. Maven 父pom中dependencyManagement版本优先级高于传递依赖版本

    当使用了传递依赖,也就是使用了没有显示声明的依赖时,如果继承的<dependencyManagement/>中声明了使用的传递依赖的版本,那么最终使用的依赖是<dependencyM ...

  2. 通俗易懂,Maven依赖pom中的scope详解

    1. compile 默认就是compile,什么都不配置也就是意味着compile.compile表示被依赖项目需要参与当前项目的编译,当然后续的测试,运行周期也参与其中,是一个比较强的依赖.打包的 ...

  3. maven项目pom中scope类型

    1.compile:默认值 他表示被依赖项目需要参与当前项目的编译,还有后续的测试,运行周期也参与其中,是一个比较强的依赖.打包的时候通常需要包含进去2.test:依赖项目仅仅参与测试相关的工作,包括 ...

  4. Maven配置过程中出现:“‘dependencies.dependency.systemPath‘ for junit:junit:jar must be omitted...”的错误

    项目场景: 在maven的配置过程中,发现在尝试下载依赖的时候,出现了些许bug. 问题描述 采用的是直接手动导入的方法.配置好阿里云镜像仓库后(该步没有出现问题),先把junit依赖下载放到&quo ...

  5. pom中配置maven仓库(阿里仓库)

    文章目录 pom中配置maven仓库 pom中配置maven仓库 配置maven仓库,可以在maven的settings.xml里改.优点是全局统一配置,缺点是不受你项目git管理. 也可以直接在po ...

  6. maven pom java版本_Maven更新POM中的JDK版本(比如更新为JDK1.8)

    默认POM如果不指定JDK版本为1.5,而有些项目需要使用泛型这些,就必须使用1.8版本的JDK,所以需要手动修改POM. 打开pom.xml文件修改,增加如下配置节点: [...] [...] or ...

  7. Linux安装Maven、POM及配置文件详解

    下载Maven 下载地址 https://maven.apache.org/download.cgi 下载maven安装包 [root@oahzero]# wget https://mirrors.t ...

  8. springboot中maven文件pom.xml的<resource>下的<includes>和<excludes>

    filtering标签和includes,excludes标签都是resource标签下的标签,它们经常出入成双.然而这两者根本就是截然不同的. filtering用于扩大范围,什么范围呢?maven ...

  9. Maven中的profile和spring boot中的profile进行结合

    2019独角兽企业重金招聘Python工程师标准>>> 有一些应用,采用了spring boot和spring boot profile.然后想把maven 中的profile和sp ...

最新文章

  1. 重磅 | 一场你从未见过的数据中心盛会
  2. 两种方法可以达到背景图不缩放的效果
  3. NetBeans 7 Python 又回来了
  4. 关于android的外文论文,关于android的外文文献.doc
  5. RHCS图形界面建立GFS共享下
  6. jdk8中对HashMap做了哪些改变?
  7. dubbo admin默认端口_Dubbo学习(四) Dubbo 从下载到编译成功
  8. 全栈测试:平衡单元测试和端到端测试
  9. angular将html导出为pdf,如何使用Angular进行转换:将HTML转换为PDF
  10. Python编程一定要注意的那些“坑”(六)
  11. 杭电4506小明系列故事——师兄帮帮忙
  12. Python字符串常用方法(split,partition,maketrans,strip...)
  13. EXCEL批量删除当前目录下所有工作薄的所有工作表的指定行
  14. 用计算机模拟宇宙,计算机中的宇宙
  15. python批量合并txt文件内容,Python 批量合并多个txt文件的实例讲解
  16. 单片机入门--常见单片机PIC\STM32
  17. 饭谈:失眠,还有梦魇,第二天要上班应该怎么办?
  18. 个人开发者基于可编程Web的产品尝试:QCon会前采访FaWave作者李华煜
  19. 设计一个立方体类(长方体)Box,它能计算并输出立方体的体积和表面积。
  20. 书写NDIS过滤钩子驱动实现ip包过滤

热门文章

  1. c3po mysql_c3po MySQL8小时问题
  2. Linux操作系统介绍及用户管理
  3. 项目质量监测(一)——代码质量检查-书写风格、代码规范、高度耦合 代码质量监测之Js检验工具-JSLint、JSHint、ESLint
  4. 泰凌微8258入门教程 进阶篇③——LIGHT HSL+CT 彩色灯+色温灯调光
  5. 【速卖通运营干货】店铺没流量、没订单?这几点帮你了解流量来源,提升出单量!
  6. 日本区域5G专网发展分析及思考
  7. npm ERR! This is probably not a problem with npm. There is likely additional 或 Uncaught SyntaxErro
  8. semaphore java_java Semaphore
  9. Web前端零基础到实战(一)
  10. 使用Auth0对Firebase和Angular进行身份验证:第1部分