关于WAR / JAR文件的Spring启动问题

时间:2017-01-13 14:14:02

标签: spring spring-boot

经过大量的讨论并绕过网站,我设法将我的Spring启动RESTful webservice作为war文件部署到Tomcat中,使用gradle。它比文档或其他网站更简单。

但是,我只是有几个问题:

  1. 如何从13Mb文件中删除膨胀的弹簧而不是使用共享/部署的Spring版本来更轻松地支持更新库?

  2. 为什么嵌入式tomcat仍然存入我的war文件(在WEB-INF \ lib-provided下)?

  3. 有没有办法让更简单的jar版本为开发目的而构建?

  4. 对于生产系统,jar生成的文件如何与部署到容器的war文件一样好 - 您无法轻松修改配置,无法扩展(按术语或负载平衡Web服务器)并且没有管理前端。如果春天(或春季启动)的目的是真正创建自包含微服务器,我仍然无法理解扩展它甚至无法在Windows中运行不是控制台应用程序的jar ...

    < / LI>

    以下是我的文件的重点:

    apply plugin: 'java'
    apply plugin: 'org.springframework.boot'
    apply plugin: 'war'
    
    dependencies {
        compile("org.springframework.boot:spring-boot-starter-web")
        testCompile('org.springframework.boot:spring-boot-starter-test')
        providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
    }
    

    代码:

    @SpringBootApplication
    public class Application extends SpringBootServletInitializer {
    
        public static void main(String[] args)  {
            SpringApplication.run(Application.class, args);
        }
    
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
            return builder.sources(Application.class);
        }
    
    }
    

    感谢。

2 个答案:

答案 0 :(得分:1)

这应该是几个问题,所以我(尽量)回答我可以回答的问题。我没有使用Gradle,但我很了解Maven并且原理是一样的。

<强> 1 即可。我不知道为什么13Mb jar会引起关注,但是你可以将依赖声明为compileOnly scope.假设服务器的类路径具有所需的依赖性,这应该可行,尽管我和# 39;从未测试过它。

然而,这里还有其他潜在的问题。您的目标:&#34;使用共享/部署的Spring版本来更轻松地支持更新库?&#34; 似乎是一个好主意,直​​到您更新服务器上的版本并且它打破你的申请。每个应用程序只有在经过测试后才能管理自己的依赖关系并部署依赖项升级(作为应用程序的新版本),这样更安全。

2. 嵌入式Tomcat是spring-boot-starter-web中包含的依赖项。您应该能够以这种方式排除它:

configurations {
    runtime.exclude module: 'spring-boot-starter-tomcat'
}

3. 你如何定义更简单?再一次,没有看到问题,但无论如何这似乎是一个坏主意。我希望我所做的一切都能完全反映(或尽可能接近)我将要投入生产的内容。

4. 任何方法都有利弊。你使用最适合你情况的东西。 JAR可以是独立的,对于小型服务,可能会更好。

答案 1 :(得分:1)

如果您使用Maven,然后创建spring-boot war文件,则需要在片段代码下方针对此配置使用部署描述符文件(web.xml)或同等的Java基本配置(如初始化器类),您已编写了以下内容来制作war文件

@SpringBootApplication
public class Application extends SpringBootServletInitializer {

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

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(Application.class);
    }

}

并排除默认的嵌入式服务器依赖项,如果包装为jar,则将jar更改为war,然后运行maven目标(如maven clean install),则将获得war文件