【问题标题】:Spring boot questions on WAR/JAR files关于 WAR/JAR 文件的 Spring Boot 问题
【发布时间】:2017-01-13 14:14:01
【问题描述】:

在网站上经过大量的摸索和转圈后,我设法使用 gradle 将我的 Spring boot RESTful web 服务作为一个 war 文件部署到 Tomcat 中。它比文档或其他网站制作的要简单得多。

不过,我只有几个问题:

  1. 如何从我的 13Mb 文件中删除 spring 的膨胀,而改为使用共享/部署的 Spring 版本,以便更轻松地支持更新库?

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

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

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

以下是我的文件的要点:

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);
    }

}

谢谢。

【问题讨论】:

    标签: spring spring-boot


    【解决方案1】:

    这应该是几个问题,所以我会(尝试)回答我能回答的问题。我不使用 Gradle,但我对 Maven 非常了解,原理都是一样的。

    1。我不知道为什么 13Mb jar 会引起关注,但您可以将依赖项声明为 compileOnly scope. 假设服务器的类路径具有所需的可用依赖项,这应该可以工作,尽管我从未测试过它.

    但是,这里还有其他潜在问题。您的目标:“改为使用共享/部署的 Spring 版本,以便更轻松地支持更新库?” 似乎是个好主意,直​​到您更新服务器上的版本并破坏您的应用程序。每个应用程序管理自己的依赖项并仅在测试后部署依赖项升级(作为应用程序的新版本)会更安全。

    2. 嵌入式 Tomcat 是一个包含在 spring-boot-starter-web 中的依赖项。您应该可以通过这种方式排除它:

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

    3.您如何定义更简单?同样,没有看到问题,但无论如何这似乎是一个坏主意。我希望我正在做的任何事情都能准确地反映(或尽可能接近)我将要投入生产的东西。

    4. 任何方法都有利有弊。您使用最适合您的情况的方法。一个 JAR 可以是自包含的,对于小型服务,也许这样会更好。

    【讨论】:

    • 谢谢。关于 3,我只是从代码/测试周期中单击构建然后运行比单击构建然后部署到 tomcat 并运行要快得多。真的,我正在寻求一种不必手动修改我的代码/gradle 来满足创建 jar 和战争的方法。
    • 啊,我明白了。我不那样工作(由于我的工作限制,而且我不在工作之外做 Spring/Java),但我根据环境设置了 Maven 配置文件。如果你这样做,它可能会解决这个问题。你可以让你的包装有条件。参考这个:gradle.org/blog/…
    【解决方案2】:

    如果您使用 maven,则创建 spring-boot 战争文件需要部署描述符文件(web.xml)或其等价的 java 基本配置,例如在 sn-p 代码下方的此配置的初始化程序类,您编写的战争文件如下

    @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 clean install一样运行maven目标,然后你会得到war文件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-07
      • 2016-05-01
      • 2023-04-01
      • 2018-10-31
      • 2017-12-23
      • 1970-01-01
      • 2018-06-26
      • 2021-07-23
      相关资源
      最近更新 更多