您现在的位置是:首页 > 文章详情

如何将已有项目迁移到Spring Boot

日期:2018-11-28点击:555

1、创建可部署的war文件


生成可部署war文件的第一步是创建一个 SpringBootServletInitializer的子类并重写它的configure方法。这样就可以利用Spring Servlet 3.0的支持,并允许在servlet容器启动时配置你的应用程序。通常,main方法所在的类需要继承SpringBootServletInitializer:

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


下一步是更新构建配置,以便您的项目生成war文件而不是jar文件。如果你使用Maven并使用spring-boot-starter-parent(它为你配置Maven的war插件),你所需要做的就是修改pom.xml文件把工程更改为war工程:

<packaging> war </ packaging>


如果你使用Gradle,你需要修改build.gradle以将war插件用到项目中:

apply plugin:'war'


最后一步是确保内置servlet容器不会干扰要部署war文件的servlet容器。为此,您需要按给定方式声明内置servlet容器依赖关系。


Maven:

<dependencies>     <!-- … -->     <dependency>         <groupId>org.springframework.boot</groupId>         <artifactId>spring-boot-starter-tomcat</artifactId>         <scope>provided</scope>     </dependency>     <!-- … --> </dependencies>


Gradle:

dependencies {      // ...      providedRuntime'org.springframework.boot :spring-boot-starter-tomcat'      // ...  }


[注意] 

如果您使用的Gradle版本仅支持仅编译依赖项(2.12或更高版本),则应继续使用providedRuntime。在其他某些限制条件内, 如果compileOnly依赖不在测试类的路径中,这将导致任何基于Web的集成测试将失败。 

如果您使用Spring Boot构建工具,那么将内置Servlet容器依赖关系标记为已提供将产生一个可执行文件,并在目录中打包提供的依赖lib-provided关系。这意味着,除了被部署到一个servlet容器,也可以使用运行应用程序java -jar的命令行上。


看一下Spring Boot的示例应用程序,用于上述配置的基于Maven的示例 。


2、为旧的servlet容器创建可部署的war文件


较旧的Servlet容器不支持Servlet 3.0中使用的ServletContextInitializer引导进程。 但你仍可以在这些容器中使用Spring和Spring Boot,只是需要添加一个web.xml到应用程序中,并配置它通过DispatcherServlet加载一个ApplicationContext。


3、将现有应用程序转换为Spring Boot


对于非web应用程序应该很容易(ApplicationContext通过调用替换为SpringApplication或 SpringApplicationBuilder)。Spring MVC应用程序通常需要先创建可部署的war应用程序,然后将其迁移到可执行的war或jar。jar转war指南


创建一个继承自SpringBootServletInitializer(例如,在一个叫做类Application)的可部署war包,并添加Spring Boot的@SpringBootApplication注解。例:

@SpringBootApplication public class Application extends SpringBootServletInitializer {     @Override     protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {          //自定义应用程序或调用application.sources(...)添加源         //因为我们的例子本身是一个@Configuration类(通过@SpringBootApplication)         //我们实际上不需要重写这个方法。         return application;     } }


记住,无论你放在什么sources只是一个Spring ApplicationContext,通常已经运行东西都继续在这里运行。可能有一些bean你可以以后删除,让Spring Boot为它们提供自己的默认值,但某些工作应优先进行。


静态资源可以移动到/public(或/static或)/resources或 /META-INF/resources)在类路径根目录中。messages.properties(Spring Boot在类路径的根目录中自动检测到这一点)也是如此。


Vanilla对Spring DispatcherServlet和Spring Security的使用不需要进一步的修改。如果你的应用程序还有其他特性,如使用其他servlet或过滤器,那么你需要添加一些配置到Application context。web.xml中替换的标签如下:


一个在容器中的Servlet或ServletRegistrationBean类型的带有@Bean注解的类会被构建安装,如果它在web.xml中被或中被配置的话。

一个Filter或FilterRegistrationBean类型的带有@Bean注解的类,其运行方式就像先前被和配置的类。

一个在XML文件中的ApplicationContext添加一个@Import注解就可以添加进Application。或者在已经大量使用注解配置的情况下在几行代码中重新定义@Bean注解。

为使war包运行,便需向应用程序中添加一个可执行的main方法,如

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


[注意] 

如果打算将应用程序打为war或可执行应用程序,需要共享建设者的自定义中,可以执行SpringBootServletInitializer回调方法和main方法,就像这样:

@SpringBootApplication public class Application extends SpringBootServletInitializer {     @Override     protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {         return configureApplication(builder);     }     public static void main(String[] args) {         configureApplication(new SpringApplicationBuilder()).run(args);     }     private static SpringApplicationBuilder configureApplication(SpringApplicationBuilder builder) {         return builder.sources(Application.class).bannerMode(Banner.Mode.OFF);     } }


应用程序可以分为多个类别:


没有web.xml的Servlet 3.0+应用程序。

带有web.xml的应用程序。

具有上下文层次结构的应用程序。

没有上下文层次结构的应用程序。

所有这些都应该适合转译,但每个可能需要略有不同的技巧。


如果已经使用Spring Servlet 3.0+初始化程序支持类,Servlet 3.0+应用程序就很容易转译。通常现存在 WebApplicationInitializer上的所有代码都可以迁移到SpringBootServletInitializer。如果现有的应用程序有多个ApplicationContext(例如,使用 AbstractDispatcherServletInitializer),那么可以将所有的上下文源合并为单个SpringApplication。其中可能遇到的问题是,如果程序运行失败,就需要维护上下文层次结构。请参阅 构建一个层次的条目的例子。包含Web特定功能的现有父上下文通常需要分解,以便所有ServletContextAware组件都在子上下文中。


非Spring应用程序的应用程序会更容易转换为Spring Boot应用程序,上述指导可能会有所帮助,但过程可能会有所不同。


4、将WAR部署到WebLogic


要将Spring Boot应用程序部署到WebLogic,必须确保您的servlet初始化程序直接实现WebApplicationInitializer(即使您从已实现它的基类扩展)。


WebLogic的典型初始化方法:

import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.web.SpringBootServletInitializer; import org.springframework.web.WebApplicationInitializer; @SpringBootApplication public class MyApplication extends SpringBootServletInitializer implements WebApplicationInitializer { }


如果使用logback,您还需要告诉WebLogic更合适打包的版本,而不是预先安装的版本。您可以通过添加一个WEB-INF/weblogic.xml文件来做到这一点 ,内容如下:

<?xml version="1.0" encoding="UTF-8"?> <wls:weblogic-web-app     xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee         http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd         http://xmlns.oracle.com/weblogic/weblogic-web-app         http://xmlns.oracle.com/weblogic/weblogic-web-app/1.4/weblogic-web-app.xsd">     <wls:container-descriptor>         <wls:prefer-application-packages>             <wls:package-name>org.slf4j</wls:package-name>         </wls:prefer-application-packages>     </wls:container-descriptor> </wls:weblogic-web-app>


5、在旧(Servlet 2.5)容器中部署WAR


Spring Boot使用Servlet 3.0 API来初始化ServletContext(寄存器Servlets 等),所以你不能在Servlet 2.5容器外使用相同的应用程序。但是,可以在旧容器上借助于特殊工具来运行Spring Boot。如果你添加org.springframework.boot:spring-boot-legacy作为依赖(单独维护 Spring Boot的核心,目前在1.0.2.RELEASE),你所需要做的是创建web.xml并声明一个context listener、 application context、filters 、servlets 。这个context listener对于Spring Boot是一个特殊的用例,但是对于Servlet 2.5中的Spring应用程序,其余部分是一般用法。例:

<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">     <context-param>         <param-name>contextConfigLocation</param-name>         <param-value>demo.Application</param-value>     </context-param>     <listener>         <listener-class>org.springframework.boot.legacy.context.web.SpringBootContextLoaderListener</listener-class>     </listener>     <filter>         <filter-name>metricsFilter</filter-name>         <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>     </filter>     <filter-mapping>         <filter-name>metricsFilter</filter-name>         <url-pattern>/*</url-pattern>     </filter-mapping>     <servlet>         <servlet-name>appServlet</servlet-name>         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>         <init-param>             <param-name>contextAttribute</param-name>             <param-value>org.springframework.web.context.WebApplicationContext.ROOT</param-value>         </init-param>         <load-on-startup>1</load-on-startup>     </servlet>     <servlet-mapping>         <servlet-name>appServlet</servlet-name>         <url-pattern>/</url-pattern>     </servlet-mapping> </web-app>


在这个例子中,我们使用的是单个应用程序上下文(由context listener创建的)并将其连接到DispatcherServlet用一个参数初始化。这在Spring Boot应用程序中是很常见的(一般只有一个application context)。


文章转自:http://lib.csdn.net/article/microservice/61732?knId=1883

原文链接:https://blog.roncoo.com/article/127881
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章