Idea 打war包并部署tomcat9运行

  • 干净的项目结构


    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包在指定位置;
image.png

一方法,直接配置成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:真实项目所在位置
image.png
  • 以上问题也可以保持默认,使用不用的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 &quot;%r&quot; %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 &quot;%r&quot; %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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352