Springboot 项目打war包并在tomcat上运行

  1. 打war包并在tomcat上运行

因为要在同一个端口上布置多个项目所以要把springboot的项目打成war包并在tomcat上运行,但实际springboot自己集成了tomcat,如果直接打war包的话(即讲packing改为war)会报错:

严重: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContex t[/demo-initial]] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:162) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1015) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:991) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652) at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1127) at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:2020) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.NoClassDefFoundError: javax/servlet/GenericFilter at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:763) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:3205) at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:1373) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1861) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1735) at org.apache.tomcat.websocket.server.WsServerContainer.<init>(WsServerContainer.java:109) at org.apache.tomcat.websocket.server.WsSci.init(WsSci.java:131) at org.apache.tomcat.websocket.server.WsSci.onStartup(WsSci.java:47) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5622) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145) ... 10 more Caused by: java.lang.ClassNotFoundException: javax.servlet.GenericFilter at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1892) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1735) ... 22 more

所以应该去除Springboot自带的tomcat,并设置tomcat运行只在编译和测试的时候用,pom代码如下

        <dependency><!-- 排除springbootweb包中的tomcate -->
            <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>
        <dependency><!-- 设置tomcat只在编译和测试时运行 -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>

这里只是将springboot里面的tomcat给去除掉了,所以不能使用创建项目的application.java 这个main方法启动项目了,需要重写一个类似于 web.xml 文件配置的方式来启动 Spring 应用上下文,方法有二

//一、让Application.java继承SpringBootServletInitializer类,并且重写configure方法
@SpringBootApplication
public class DemoApplication extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(DemoApplication.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}


//二、声明一个配置类,管理springboot的入口
@Component
public class ServletInitializer extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(DemoApplication.class);//DemoApplication启动类名称
    }

至此,就可以clean,install,package打包三连

然后将生成的war包(在项目根目录的target文件夹下)扔到tomcat的webapps文件夹下,启动tomcat就可以访问项目了

注意,项目的访问路径是localhost:8080/你项目的war包名称/接口名?参数

 

转载于:https://my.oschina.net/imsorry/blog/2993517

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将 Spring Boot 项目WAR 文件并运行,您需要执行以下步骤: 1. 修改 pom.xml 文件,将 packaging 标签的值从 jar 改为 war: ```xml <packaging>war</packaging> ``` 2. 将 SpringBootServletInitializer 类添加到您的项目。这个类是由 Spring Boot 提供的,它允许您将 Spring Boot 应用程序部署到 Servlet 容器。如果您的项目已经含了这个类,就不需要再添加了。 ```java import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; public class ServletInitializer extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(Application.class); } } ``` 3. 执行 mvn package 命令来构建 WAR 文件。构建完成后,WAR 文件将在 target 目录下生成。 ```bash mvn package ``` 4. 将 WAR 文件部署到 Servlet 容器。您可以使用 Tomcat、Jetty 等 Servlet 容器运行您的应用程序。将 WAR 文件复制到 Servlet 容器的 webapps 目录下即可。 5. 启动 Servlet 容器。您可以使用 Servlet 容器的启动脚本来启动容器。例如,如果您使用的是 Tomcat,可以运行以下命令启动 Tomcat: ```bash cd /path/to/tomcat/bin ./catalina.sh run ``` 6. 访问应用程序。一旦 Servlet 容器启动,您就可以通过浏览器访问您的应用程序。默认情况下,应用程序将在 http://localhost:8080/ 上运行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值