【问题标题】:Build single Spring Boot WAR project for deployment构建单个 Spring Boot WAR 项目进行部署
【发布时间】:2017-03-03 01:26:25
【问题描述】:

我有三个项目:

project-A
project-B 
project-C

project-A 我已经定义了数据模型。 Project-B 是一个 Spring Boot 项目,我在其中定义了使用 RestTemplate 使用 rest API 调用的操作。 Project-C 也是一个 Spring Boot 项目,我在其中公开了一些 REST 服务。 第二个项目 (B) 需要第一个项目 (A) 的依赖项。第三个项目 (C) 需要第一个和第二个项目 (A, B) 的依赖项。我已经在各自的项目(B,C)pom 文件中定义了这些依赖项。 这三个项目都有pom 包装类型。

现在我想创建一个 Spring Boot WAR 项目以部署在 tomcat 服务器上。我的目的是拥有一个封装所有其他项目(A、B、C)的单一 WAR。所以我希望能够通过这个单一的 WAR 访问我的休息服务 (project-C)。

我尝试创建一个包装类型为 war 的 Spring Boot 项目,并添加了 project-C 的依赖项(其中包括 project-Aproject-B 的依赖项),但我无法部署生成的 WAR 文件因为一个:

SEVERE [localhost-startStop-1] org.apache.catalina.core.ContainerBase.addChildInternal ContainerBase.addChild: start:
org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/mywarproject-war-0.0.1-SNAPSHOT]]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:752)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:728)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)
        at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:952)
        at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1823)
        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:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [org.apache.catalina.webresources.StandardRoot@af7b84d]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
        at org.apache.catalina.core.StandardContext.resourcesStart(StandardContext.java:4842)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4974)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        ... 10 more
Caused by: org.apache.catalina.LifecycleException: Failed to initialize component [org.apache.catalina.webresources.JarResourceSet@517f5687]
        at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:112)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:140)
        at org.apache.catalina.webresources.StandardRoot.startInternal(StandardRoot.java:708)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        ... 13 more
Caused by: java.lang.IllegalArgumentException: java.util.zip.ZipException: error in opening zip file
        at org.apache.catalina.webresources.AbstractSingleArchiveResourceSet.initInternal(AbstractSingleArchiveResourceSet.java:113)
        at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:107)
        ... 16 more
Caused by: java.util.zip.ZipException: error in opening zip file
        at java.util.zip.ZipFile.open(Native Method)
        at java.util.zip.ZipFile.<init>(ZipFile.java:219)
        at java.util.zip.ZipFile.<init>(ZipFile.java:149)
        at java.util.jar.JarFile.<init>(JarFile.java:166)
        at java.util.jar.JarFile.<init>(JarFile.java:103)
        at org.apache.catalina.webresources.AbstractSingleArchiveResourceSet.initInternal(AbstractSingleArchiveResourceSet.java:110)

有没有办法处理这种方法?

【问题讨论】:

  • WAR 文件的名称是什么?
  • 有点像 mywarproject-war-0.0.1-SNAPSHOT

标签: java spring maven spring-boot war


【解决方案1】:

你必须将你的 Spring-Boot 项目打包为你的 pom 中的一个 war,并在 spring-boot-starter-web 依赖项中排除 spring-boot-starter-tomcat 依赖项。

<packaging>war</packaging>


    <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>

您必须在您的 REST-Services 项目上执行此操作,在您的情况下是 Project-C。

【讨论】:

  • 这解决了我的war文件在Tomcat中的部署问题,但是现在我想在Tomcat中访问我的rest服务(项目-C)。我的战争文件不包含任何 java 代码。它只包含其余服务(项目-C)的依赖关系。
猜你喜欢
  • 1970-01-01
  • 2014-07-15
  • 1970-01-01
  • 1970-01-01
  • 2016-06-17
  • 2015-03-10
  • 2018-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多