Java项目打包部署

Java项目打包部署

JAR包方式部署

SpringBoot项目默认打包成jar包,jar包方式启动,也就是使用SpringBoot内置的tomcat运行。服务器上面只要你配置了jdk1.8及以上就ok,不需要外置tomcat。

1)配置maven打包插件
<build>
	<finalName>item-boot-demo-${version}</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>2.3.4.RELEASE</version>
            <configuration>
                <!-- 如果没有该配置,devtools不会生效 -->
                <fork>true</fork> 
            </configuration>
            <executions>
                <execution>
                    <goals>
                    	<goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
    	</plugin>
	</plugins>
</build>

2)执行打包命令
-- 跳过测试文件进行打包(如果缺少某些文件,则先执行install命令进行本地安装)
mvn package -DskipTests=true -DskipTests=true

3)上传jar包并部署(jar包位置在target文件夹下)
-- 将jar包放到Linux服务器任意目录,执行下面的命令即可启动项目服务
nohup java -jar test.jar &
-- 指定环境启动
nohup java -jar test.jar --spring.profiles.active=prd &
-- 指定环境和端口
nohup java -jar test.jar --spring.profiles.active=test --server.port=9002 &
-- 这种方法会把日志文件输入到你指定的文件中,没有则会自动创建nohup.out。进程会在后台运行。
nohup java -jar test.jar >temp.txt &

4)停止项目运行
-- 查看所有java进程
ps aux|grep java
-- 查看java项目进程
ps aux|grep test.jar
-- 杀死进程
kill -9 30768

Linux启动脚本

1)启动脚本(命名为startup.sh放在jar包同级目录,执行时定位到当前文件夹,输入./startup.sh执行)
# 端口号
export server_port=8002
# 服务名
export service_name=resource
# JVM启动参数
export jvm_args=-Dfile.encoding=utf-8
# 环境
export profiles_active=prod
# nacos注册中心
export config_server_addr=127.0.0.1:8848
# nacos命名空间
export config_server_namespace=8af69ba8-fe8d-441e-849e-c382cd6586dd
# 启动的jar名字
export jar_name=test.jar

nohup java $jvm_args -jar $jar_name\
		--server.port=$server_port\
		--spring.cloud.nacos.discovery.server-addr=$config_server_addr\
		--spring.cloud.nacos.discovery.namespace=$config_server_namespace\
		--spring.profiles.active=$profiles_active\
		>/dev/null 2>&1 &

或者:
# 设置工程路径
project_path=/root/test
cd $project_path
# nohup后台启动,输出日志到test.log
nohup java -jar test.jar >test.log &
# 打印日志
tail -f test.log

# 设置文件执行权限
chmod +x startup.sh
# 执行程序
./startup.sh

2)关闭脚本(命名为shutdown.sh放在jar包同级目录)
# 设置关闭的端口
port=8080
# 获取此端口运行的进程
pid=`lsof -t -i:$port`
# 判断如果进程号不为空则,关闭进程
if test -z "$pid";then
   echo "test 工程未启动!"
else
  kill -9 $pid
  echo "test 工程进程$pid 关闭成功!"

或者使用应用名获取其进程号:
pid=$(jps -l|grep test.jar |awk '{print $1}')
echo "test.jar pid "+${pid}+"will be kill"

3)查看日志文件
-- 进入日志文件所在文件夹直接定位查看(推荐使用)
cat test.log
-- 通过shell脚本查看(命名为viewlogs.sh放在jar包同级目录)
tail -f ../logs/resource/web_info.log -n 500

Windows启动脚本

1)启动脚本(命名为startup.bat放在jar包同级目录,执行时定位到当前文件夹,输入startup.bat执行)
@echo off
chcp 65001
@rem #端口号
set server_port=8004
@rem #服务名
set service_name=resource
@rem #JVM启动参数
set jvm_args=-Dfile.encoding=utf-8
@rem #环境
set profiles_active=test
@rem #nacos注册中心
set config_server_addr=127.0.0.1:8848
@rem #nacos命名空间
set config_server_namespace=bede63e9-a433-4aed-b722-d3bd2efa7cfc
@rem #启动的jar名字
set jar_name=test.jar

title %service_name% && java %jvm_args% -jar %jar_name%^
		--server.port=%server_port%^
		--spring.cloud.nacos.discovery.server-addr=%config_server_addr%^
		--spring.cloud.nacos.discovery.namespace=%config_server_namespace%^
		--spring.profiles.active=%profiles_active%

2)关闭脚本(命名为shutdown.bat放在jar包同级目录)
taskkill /pid 31628 -t -f

WAR包方式部署

传统的部署方式:将项目打成war包,放入tomcat 的webapps目录下面,启动tomcat,即可访问。

1)修改maven配置
<packaging>jar</packaging>
//修改为
<packaging>war</packaging>

<!-- 添加servlet-api的依赖,用来打war包,这个依赖主要是用于在和jsp进行整合的使用,可酌情添加 -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <scope>provided</scope>
</dependency>

<!-- 最终打成war包,排除内置的tomcat -->
<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>

<!-- 配置编译插件 -->
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

2)启动类的改造
如果是war包发布,需要增加SpringBootServletInitializer子类,并重写其configure方法,或者将main函数所在的类继承SpringBootServletInitializer子类,并重写configure方法。这种改造方式也是官方比较推荐的方法。
@SpringBootApplication
public class MainApp extends SpringBootServletInitializer {
    public static void main(String[] args) {
        SpringApplication.run(MainApp.class,args);
    }
  
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        // 注意这里要指向原先用main方法执行的Application启动类
        return builder.sources(MainApp.class);
    }
}

3)编译war包
在IDEA中使用mvn clean命令清除旧的包,并使用mvn package生成新的war包。执行完毕后,可以看到war包已经生成了,默认是在target目录下,位置可以在pom文件中进行配置。

4)部署到tomcat
使用外部Tomcat运行该war文件,有两种方式。第一种把war文件直接丢到tomcat的webapps目录,启动tomcat;第二种使用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>

注意:将项目打成war包,部署到外部的tomcat中,这个时候,不能直接访问spring boot项目中配置文件配置的端口。application.yml中配置的server.port配置的是spring boot内置的tomcat的端口号, 打成war包部署在独立的tomcat上之后, 你配置的server.port是不起作用的。其实我们从tomcat的启动界面,已经可以看出,是启动的哪个端口。

JAR包和WAR包对比

1)SpringBoot项目打包时能打成jar与war包,对比两种打包方式,jar更加简单方便,使用java -jar xx.jar就可以启动。所以打成jar包的最多。而war包可以部署到tomcat的webapps中,随Tomcat的启动而启动。具体使用哪种方式,应视应用场景而定。
2)打jar包时不会把src/main/webapp下的内容打到jar包里 (你认为的打到jar包里面,路径是不行的会报404)。打war包时会把src/main/webapp下的内容打到war包里。
3)打成什么文件包进行部署与项目业务有关,就像提供restful API服务的项目需要打包成jar文件,用命令运行很方便。而有大量css、js、html且需要经常改动的项目,打成war包去运行比较方便,因为改动静态资源可以直接覆盖,很快看到改动后的效果,这是jar包不能比的(举个‘栗’子:项目打成jar包运行,一段时间后,前端要对其中某几个页面样式进行改动,使其更美观,那么改动几个css、html后,需要重新打成一个新的jar包,上传服务器并运行,这种改动频繁时很不友好,文件大时上传服务器很耗时,那么war包就能免去这种烦恼,只要覆盖几个css与html即可)。
posted @ 2023-08-21 09:37  肖德子裕  阅读(435)  评论(0编辑  收藏  举报