美文网首页
Idea 打war包并部署tomcat9运行

Idea 打war包并部署tomcat9运行

作者: CoderLJW | 来源:发表于2019-07-31 13:45 被阅读0次
    • 干净的项目结构


      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
    

    相关文章

      网友评论

          本文标题:Idea 打war包并部署tomcat9运行

          本文链接:https://www.haomeiwen.com/subject/oquzrctx.html