springboot项目部署
- pom文件中配置
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.0.RELEASE</version>
<!--
给可执行jar包添加后缀,防止和编译jar包重名导致覆盖了编译jar包,使依赖jar包的模块编译失败
原因:package打包生成不可执行的、但可依赖的普通jar包。当repackage时会将普通jar包再次打包为可执行的jar包,新生成的可执行jar包和原来的普通jar包同名,插件会将普通jar包改名【直接在原jar包名后加后缀.original】,当其他依赖的模块去依赖该包时依赖的是可执行jar包,而不是普通jar包
SpringBoot工程打包编译时,会生成两种jar包,一种是普通的jar,另一种是可执行jar。默认情况下,这两种jar的名称相同,在不做配置的情况下,普通的jar先生成,可执行jar后生成,造成可执行jar会覆盖普通的jar。
-->
<configuration>
<classifier>exec</classifier>
</configuration>
<!--默认执行的功能【goals】就是repackage,重新将不可执行、用于依赖的jar包打包成可执行的jar包-->
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
spring-boot-maven-plugin插件已经集成了maven-surefire-plugin插件
(1)使用maven.test.skip,不但跳过单元测试的运行,也跳过测试代码的编译。
<properties>
<maven.test.skip>true</maven.test.skip>
</properties>
(2)使用skipTests,不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下--
<properties>
<skipTests>true</skipTests>
</properties>
使用org.apache.maven.plugin插件打包,不使用spring-boot-maven-plugin插件时:
<plugin>
<groupId>org.apache.maven.plugin</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.1</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
- 生成可执行的jar包
在IDEA的MAVEN中选择lifecycle生命周期中的package,会自动将之前生成的jar包repackage生成可执行的jar包
- 运行
方式1:jar包方式运行
使用spring boot内置的tomcat运行,服务器上面需要配置jdk1.8及以上,不需要外置tomcat
nohup java -jar jar包名.jar >out.txt 2>&1 &
重点:&只是将该命令放到后台运行,若想终端关闭,程序也想运行,需要使用nohup 命令
(1)把日志文件输入到你指定的文件out.txt中,没有则会自动创建
(2)最后的&表示:进程会在后台运行
(3)nohup:表示会话窗口(shell终端窗口)关闭后,进程仍会继续运行,没有该指令则会停止运行
(4)2:标准错误 1:标准输出 标准错误输入到标准输出中,标准输出到out.txt文件中
启动时重新指定内置tomcat的端口:
java -jar jar包名.jar --server.port=9000 >out.txt 2>&1 &
启动jar包时,springBoot会按照以下顺序去寻找配置文件:
1、“当前目录”的/config文件夹下
2、“当前目录”下
3、classpath的/config文件夹下
4、classpath下
(1)“当前目录”指的是我们打成可执行jar包后,一般会用bat文件来启动,这个当前目录指的就是bat文件的目录,而不是jar包所在的目录
(2)当找到配置文件后将不会再继续寻找,也就说该文件优先级以下的配置文件将不会被读取,找到即停止
上面是springboot默认去拿自己的核心配置文件的优先级,还有一种最高优先级的方式是项目启动时通过命令的方式指定项目加载核心配置文件,命令如下
java -jar myproject.jar --spring.config.name = myproject
java -jar myproject.jar --spring.config.location =
classpath:/default.properties,classpath:/override.properties
java -jar --Dspring.config.location=
D:\speech\default.properties analysis-speech-tool-0.0.1-SNAPSHOT.jar
如果您不喜欢 application.properties
作为配置文件名,则可以通过指定 spring.config.name
环境属性来切换到另一个名称。还可以使用 spring.config.location
环境属性(以逗号分隔的目录位置列表或文件路径)引用显式位置。
如果只是像上边那样配置,jar文件当中其实还有一份配置文件,只不过加载的时候被优先级更高的config
目录的配置文件覆盖了。如果要消除jar文件中的配置文件,可以在pom.xml文件中指定剔除的配置文件
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>**/*.properties</exclude>
<exclude>**/*.yml</exclude>
</excludes>
</resource>
</resources>
</build>
方式2:war包方式运行
注意:
(1)application.yml配置文件中,配置的server.port配置的是spring boot内置的tomcat的端口号,打成war包部署在独立的tomcat上之后, 你配置的server.port是不起作用的
(2)使用外部Tomcat部署访问的时候,application.properties(或者application.yml)中配置的
server.port和server.servlet.context-path将失效,请使用tomcat的端口,tomcat,webapps下项目名进行访问。
- pom文件中配置
(1)修改pom.xml文件将默认的jar方式改为war:
<groupId>com.example</groupId>
<artifactId>application</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!--默认为jar方式-->
<!--<packaging>jar</packaging>-->
<!--改为war方式-->
<packaging>war</packaging>
(2) 打包时跳过单元测试
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<!--跳过单元测试,但是会继续编译,生成相应的class文件至target/test-classes下,
surefire plugin方式跳过maven test, 等同$ mvn package -DskipTests-->
<skipTests>true</skipTests>
<!-- 使用maven.test.skip,不但跳过单元测试的运行,也跳过测试代码的编译
maven方式跳过maven test, 等同$ mvn package -Dmaven.test.skip=true-->
<maven.test.skip>true</maven.test.skip>
</properties>
二者的根本区别在于<skipTests>true</skipTests>会编译测试类,而 <maven.test.skip>true</maven.test.skip>不会编译测试类。
(2)排除spring-boot-starter-web中的Tomcat
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 移除springboot内嵌的tomcat -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
(3)添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<!--打包的时候可以不用包进去,tomcat服务器会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。
相当于compile,但是打包阶段做了exclude操作-->
<scope>provided</scope>
</dependency>
(4)如果需要将配置文件和jar包/war包分离,则需要进行如下配置,指定打包不包含的配置文件
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>**/*.properties</exclude>
<exclude>**/*.yml</exclude>
</excludes>
</resource>
</resources>
</build>
- 修改启动Application文件继承SpringBootServletInitializer,实现configure方法
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(Application.class);
}
}
- 使用外部Tomcat运行该 war 文件,有两种方式
方式1: 把war 包文件直接丢到 tomcat的webapps目录,进入bin目录使用运行startup.sh脚本启动tomcat
**方式2:**使用tomcat - conf - server.xml配置,使用target目录中war包解压的文件夹为项目地址进行部署
<Service name="testWar">
<Connector port="8088" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="true" redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="utf-8"/>
<Engine name="hnswzy" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
<Host name="localhost" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context path="" reloadable="true" docBase="D:\project\springboot\war\target\war-0.0.1">
</Context>
</Host>
</Engine>
</Service>