将 Spring 引导依赖项从 1.5.3.RELEASE 更新到 2.2.7.RELEASE 会破坏 Spring 应用程序
Updating Spring Boot dependencies from 1.5.3.RELEASE to 2.2.7.RELEASE breaks Spring App
我是使用 Spring Boot 的新手,我从 1.5.3 复制了一个项目并拥有应用程序 运行 此代码用于 spring/application.java
@SpringBootApplication(scanBasePackages = "com.company")
@ComponentScan(basePackages = "com.company")
@EntityScan(basePackages = "com.company")
@EnableTransactionManagement
@EnableScheduling
public class Application {
private static final Logger log = LoggerFactory.getLogger(Application.class);
public static void main(String[] args) throws Exception {
// log.info("Starting up... main args: " + Arrays.asList(args));
System.setProperty("spring.devtools.restart.enabled", "false");
// Runs Orchestration:run(args) via Spring
new SpringApplicationBuilder(Application.class)
// .web(WebApplicationType.NONE) <- this part is uncommented in 2.2.7 run
.run(args);
}
}
我也有一个@Component class,它在 SpringApplicatoinBuilder 被调用后运行。
@Component
public class Orchestration implements CommandLineRunner {
@Override
public void run(String...args) throws Exception {
// stuff
}
}
当我将模块 pom 文件中的所有依赖项从 1.5.3.RELEASE 升级到 2.2.7.RELEASE 时,应用程序似乎不再调用 Orchestration @Component。我查看了其他示例并引入了本文 https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guide 中提到的迁移器依赖项。但是没有运气 运行 Spring App 正确。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>4.3.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jersey</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>${spring-boot.version}</version>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>${spring-boot.version}</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-properties-migrator</artifactId>
<version>${spring-boot.version}</version>
</dependency>
</dependencies>
最糟糕的是我没有收到任何编译或运行时错误,所以我不确定这里哪里出了问题。在 Spring 2.2.7 方面更有经验的人可以帮助我进行项目设置吗?
编辑 2021 年 10 月 13 日 6:18pm
更新到 2.5.5 版本时,我确实在 SpringApplicationBuilder class ...
收到一条错误消息
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:108)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88)
Caused by: java.lang.NoClassDefFoundError: org/springframework/core/metrics/ApplicationStartup
at org.springframework.boot.SpringApplication.<init>(SpringApplication.java:253)
at org.springframework.boot.SpringApplication.<init>(SpringApplication.java:266)
at org.springframework.boot.builder.SpringApplicationBuilder.createSpringApplication(SpringApplicationBuilder.java:108)
at org.springframework.boot.builder.SpringApplicationBuilder.<init>(SpringApplicationBuilder.java:97)
at com.planalytics.rp.orchestration.spring.Application.main(Application.java:35)
... 8 more
Caused by: java.lang.ClassNotFoundException: org.springframework.core.metrics.ApplicationStartup
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:151)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 13 more
这些依赖项由您声明的 Spring 引导核心构件提取。这通常是通过您声明为项目的父 pom 的 spring-boot-starter-parent
完成的。
为了将您的项目更新到 Spring 5(实际发布的版本),您必须将 spring-boot-starter-parent 父声明从 1.5.3 更新到 2.X(或者 spring-boot-dependencies
依赖版本,如果你不使用起始父级的话)。
您确实可以在 Spring Boot 2 的发行说明中读到:
Spring Boot 2.0 基于并需要 Spring Framework 5.
请注意,从 Spring Boot 1.5.3 更新到 Spring Boot 2 可能会对您的应用程序造成一些影响。
所以你应该注意仔细测试你的应用程序以识别所有这些。
Spring-Boot-2.0-Migration-Guide 也是简化迁移的好资源。
这是通过将 org.springframework.boot:spring-boot-starter:jar:2.0.2.RELEASE 声明为项目的父级而得到的片段
$ mvn dependency:tree
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------------------------------------------
[INFO] Building demo 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:3.0.2:tree (default-cli) @ demo ---
[INFO] com.example:demo:jar:0.0.1-SNAPSHOT
[INFO] +- org.springframework.boot:spring-boot-starter:jar:2.5.5.RELEASE:compile
[INFO] | +- org.springframework.boot:spring-boot:jar:2.5.5.RELEASE:compile
[INFO] | | \- org.springframework:spring-context:jar:5.0.6.RELEASE:compile
[INFO] | | +- org.springframework:spring-aop:jar:5.0.6.RELEASE:compile
[INFO] | | +- org.springframework:spring-beans:jar:5.0.6.RELEASE:compile
[INFO] | | \- org.springframework:spring-expression:jar:5.0.6.RELEASE:compile
[INFO] | +- org.springframework.boot:spring-boot-autoconfigure:jar:2.5.5.RELEASE:compile
[INFO] | +- org.springframework.boot:spring-boot-starter-logging:jar:2.5.5.RELEASE:compile`
...
我是使用 Spring Boot 的新手,我从 1.5.3 复制了一个项目并拥有应用程序 运行 此代码用于 spring/application.java
@SpringBootApplication(scanBasePackages = "com.company")
@ComponentScan(basePackages = "com.company")
@EntityScan(basePackages = "com.company")
@EnableTransactionManagement
@EnableScheduling
public class Application {
private static final Logger log = LoggerFactory.getLogger(Application.class);
public static void main(String[] args) throws Exception {
// log.info("Starting up... main args: " + Arrays.asList(args));
System.setProperty("spring.devtools.restart.enabled", "false");
// Runs Orchestration:run(args) via Spring
new SpringApplicationBuilder(Application.class)
// .web(WebApplicationType.NONE) <- this part is uncommented in 2.2.7 run
.run(args);
}
}
我也有一个@Component class,它在 SpringApplicatoinBuilder 被调用后运行。
@Component
public class Orchestration implements CommandLineRunner {
@Override
public void run(String...args) throws Exception {
// stuff
}
}
当我将模块 pom 文件中的所有依赖项从 1.5.3.RELEASE 升级到 2.2.7.RELEASE 时,应用程序似乎不再调用 Orchestration @Component。我查看了其他示例并引入了本文 https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guide 中提到的迁移器依赖项。但是没有运气 运行 Spring App 正确。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>4.3.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jersey</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>${spring-boot.version}</version>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>${spring-boot.version}</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-properties-migrator</artifactId>
<version>${spring-boot.version}</version>
</dependency>
</dependencies>
最糟糕的是我没有收到任何编译或运行时错误,所以我不确定这里哪里出了问题。在 Spring 2.2.7 方面更有经验的人可以帮助我进行项目设置吗?
编辑 2021 年 10 月 13 日 6:18pm 更新到 2.5.5 版本时,我确实在 SpringApplicationBuilder class ...
收到一条错误消息Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:108)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88)
Caused by: java.lang.NoClassDefFoundError: org/springframework/core/metrics/ApplicationStartup
at org.springframework.boot.SpringApplication.<init>(SpringApplication.java:253)
at org.springframework.boot.SpringApplication.<init>(SpringApplication.java:266)
at org.springframework.boot.builder.SpringApplicationBuilder.createSpringApplication(SpringApplicationBuilder.java:108)
at org.springframework.boot.builder.SpringApplicationBuilder.<init>(SpringApplicationBuilder.java:97)
at com.planalytics.rp.orchestration.spring.Application.main(Application.java:35)
... 8 more
Caused by: java.lang.ClassNotFoundException: org.springframework.core.metrics.ApplicationStartup
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:151)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 13 more
这些依赖项由您声明的 Spring 引导核心构件提取。这通常是通过您声明为项目的父 pom 的 spring-boot-starter-parent
完成的。
为了将您的项目更新到 Spring 5(实际发布的版本),您必须将 spring-boot-starter-parent 父声明从 1.5.3 更新到 2.X(或者 spring-boot-dependencies
依赖版本,如果你不使用起始父级的话)。
您确实可以在 Spring Boot 2 的发行说明中读到:
Spring Boot 2.0 基于并需要 Spring Framework 5.
请注意,从 Spring Boot 1.5.3 更新到 Spring Boot 2 可能会对您的应用程序造成一些影响。 所以你应该注意仔细测试你的应用程序以识别所有这些。 Spring-Boot-2.0-Migration-Guide 也是简化迁移的好资源。
这是通过将 org.springframework.boot:spring-boot-starter:jar:2.0.2.RELEASE 声明为项目的父级而得到的片段
$ mvn dependency:tree
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------------------------------------------
[INFO] Building demo 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:3.0.2:tree (default-cli) @ demo ---
[INFO] com.example:demo:jar:0.0.1-SNAPSHOT
[INFO] +- org.springframework.boot:spring-boot-starter:jar:2.5.5.RELEASE:compile
[INFO] | +- org.springframework.boot:spring-boot:jar:2.5.5.RELEASE:compile
[INFO] | | \- org.springframework:spring-context:jar:5.0.6.RELEASE:compile
[INFO] | | +- org.springframework:spring-aop:jar:5.0.6.RELEASE:compile
[INFO] | | +- org.springframework:spring-beans:jar:5.0.6.RELEASE:compile
[INFO] | | \- org.springframework:spring-expression:jar:5.0.6.RELEASE:compile
[INFO] | +- org.springframework.boot:spring-boot-autoconfigure:jar:2.5.5.RELEASE:compile
[INFO] | +- org.springframework.boot:spring-boot-starter-logging:jar:2.5.5.RELEASE:compile`
...