Idea 打war包并部署tomcat9运行
2019-07-31 本文已影响0人
CoderLJW
-
干净的项目结构
image.png
1、修改项目pom
##### 1 修改打包方式
<groupId>com.ljw.xd</groupId>
<artifactId>wechatpay</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>wechatpay</name>
<!--默认打jar包-->
<!--<packaging>war</packaging>-->
<description>Demo</description>
##### 2 移除内置的tomcat插件
# 方式1
<!--部署成war包时开启↓↓↓↓
scope的其他参数如下:
compile:默认的scope,表示 dependency 都可以在生命周期中使用。而且,
这些dependencies 会传递到依赖的项目中。适用于所有阶段,会随着项目一起发布
provided:跟compile相似,但是表明了dependency 由JDK或者容器提供,
例如Servlet AP和一些Java EE APIs。这个scope 只能作用在编译和测试时,同时没有传递性
runtime:表示dependency不作用在编译时,但会作用在运行和测试时,如JDBC驱动,适用运行和测试阶段
test:表示dependency作用在测试时,不作用在运行时。 只在测试时使用,用于编译和运行测试代码。不会随项目发布。
system:跟provided 相似,但是在系统中要以外部JAR包的形式提供,maven不会在repository查找它。
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>compile</scope>
</dependency>
<!--部署成war包时开启↑↑↑↑-->
# 方式2
<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>
##### 3 修改打包的名称(war和jar)
<build>
<!--修改打包的名称(war和jar)-->
<finalName>wechatpay</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
##### 这里pom配置结束
##### 需要再修改项目主类WechatpayApplication
1、继承 SpringBootServletInitializer
2、重写 configure
@SpringBootApplication
// 限定扫描位置,提高效率,可以省去写@Mapper注解。默认的是都扫描,哪个带有@Mapper就加载进来
@MapperScan(value = {"com.ljw.xd.wechatpay.mapper"})
public class WechatpayApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(WechatpayApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(WechatpayApplication.class);
}
}
2、配置项目File--->ProjectStructure
-
1 进入ProjectStructure
image.png -
2 选择Artifacts,选中上面的+号
image.png - 3 这里说明不同的war的方式
- web application Exploded,这个是以文件夹形式(War Exploded)发布项目,选择这个,发布项目时就会自动生成文件夹在指定的output directory,
- web application Archive,就是war包形式,每次都会重新打包全部的,将项目打成一个war包在指定位置;
一方法,直接配置成war包的Exploded方式
-
1、From Modules种直接创建,这种省事
image.png
image.png -
2、这里就直接使用了
image.png
image.png -
结果如下,直接放在tomcat的webapps下面即可,稍等片刻即可访问项目,不用重启tomcat
image.png
二种打包方式,这个出来就是xxx.war包
-
1、需要使用到上面一种的方式生成的wares:war exploded
image.png -
2、接下来就是。到这点击ok就可以了
image.png -
3、接下来就是
image.png -
4、生成如图
image.png - 5、拖拽到tomcat的webapps下面即可,稍等片刻即可看到war包自动解压出来了,但是这个时候访问是访问不到项目的。这个和直接放置war包解压出来的文件不同。
- 直接放置war包解压出来的文件,项目稍等5秒左右即可访问,不用重启tomcat。
- 直接使用war的,需要重启tomcat或者找个任意工程,更新下里面的文件,这个时候tomcat检测到文件改变,则会再次加载下webapps里面的文件,这个时候就可以访问了。
运行在tomcat9下。
- 可以配置在如图所示,这里的配置只需要tomcat启动一次就行。localhost文件夹下面的东西或者名字修改了,tomcat会自动加载。很是方便
- 在使用server.xml配置的话,修改了server.xml则需要每次重启才有效果
image.png
访问项目则是:http://localhost:8888/bb/ - 图上:bb.xml中的bb则是对应项目的虚拟路径。里面的Context则是规定了真实项目的位置。tomcat就会去docBase这里启动需要的项目
<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="/usr/local/java/qqq_war" reloadable="true"></Context>
tomcat介绍如下
-
在conf-->server.xml。可以看到如下几个标签
image.png - 可以在server里面配置自己的项目,但是在这里的配置,需要重启tomcat才会生效。这里配置了两个服务,对应不同的项目
- Context:配置运行在当前服务下的单个web应用
- reloadable="true":默认是false,reloadable检测到classes下面的文件修改了,则会自动加载
- path:配置访问的虚拟路径。注意这里配置以后,再xx.properties里面的server.servlet.context-path则会失效。如果配置了这样:path="/aa",则访问方式就是ip:port/aa
- docBase:真实项目所在位置
- 以上问题也可以保持默认,使用不用的port来访问同一个项目或者不同项目。
- 1、直接放在webapps里面
- 2、使用/conf/Catalina/localhost目录下放置xx.xml
如下是使用配置多个端口,访问项目的时候就是
http://192.168.31.220:8080/xx/wares/data/test
http://192.168.31.220:8888/xx/wares/data/test
image.png
- 配置项目使用虚拟主机
- 需要先修改主机的host
- mac修改如下 vim /etc/hosts
# 添加
127.0.0.1 www.ljw.com
-
配置tomcat的server.xml如下:
image.png -
重启tomcat则会运行这两个web项目
配置如下
<Service name="Catalina">
<Connector port="9000" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="www.ljw.com" appBase="xxxx"
unpackWARs="true" autoDeploy="true">
<Context reloadable="true" path="/" docBase="/Users/paycloud110/JianWei/BaseProjectBackup/java/function/wechatpay/out/artifacts/wechatpay_war_exploded1234567"/>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
<Service name="Catalina">
<Connector port="9090" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="www.ljw.com" appBase="xxxx"
unpackWARs="true" autoDeploy="true">
<Context reloadable="true" path="/" docBase="/Users/paycloud110/JianWei/BaseProjectBackup/java/function/wechatpay/out/artifacts/wechatpay_war_exploded1234567"/>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
Tomcat部署多个Sring Boot项目时出现org.springframework.jmx.export.UnableToRegisterMBeanException: Unable to register MBean
简单来说,是JMX出现了问题。Spring 默认JMX是开启的,所以解决方法之一就是在application.properties或者application.yml里配置spring.jmx.enabled=false;
还有一种解决方法便是为spring.jmx.default-domain赋值;
这样就能解决重名问题啦;
添加nginx后的访问
使用ip:port访问就是如下
# 使用ip:port访问就是如下
http://192.168.31.220:8080/qqq/wares/data/test
- 8080是tomcat其中一个service的port
- qqq是利用conf/Catalina/localhost/qqq.xml配置的路径,这里对应如下,就会去找docBase对应的项目
<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="/usr/local/java/qqq_war" reloadable="true"></Context>
- wares/data/test是项目里面的具体路径了,返回信息如下
{
"code": 0,
"msg": "success",
"data": "test 就是 tomcat"
}
使用nginx的访问
# nginx的配置如下
server {
listen 80;
server_name 15a7d9a6a585.ngrok.io;
location /m80 {
proxy_pass http://127.0.0.1:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 5000M;
}
location /m88 {
proxy_pass http://127.0.0.1:8888/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 5000M;
}
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
- 这样配置后,访问项目的路径就是
http://15a7d9a6a585.ngrok.io/m80/qqq/wares/data/test
http://15a7d9a6a585.ngrok.io/m88/aaa/wares/data/test
- qqq和aaa是不同的项目
- http://15a7d9a6a585.ngrok.io/m80这样访问就会转到nginx哪里,变成了http://localhost:8080。
- 最终访问路径http://localhost:8080/qqq/wares/data/test