将Spring引导应用程序迁移到Java 9-模块
配置模块元数据
Java 9中的模块信息通过module-info.java文件实现。第一步是在源目录的根目录下创建一个这样的文件,模块名称为:
module org .springframework .samples .petclinic {}
其余的旅程可以是天堂或地狱。我很幸运受益于IntelliJ IDEA许可证。IDE会告诉它什么类,它不能读取,一个向导可以将它放在模块文件中。最后,它看起来像:
module org.springframework.samples.petclinic { requires java.xml.bind; 需要 javax.transaction.api; 需要 validation.api; 需要 hibernate.jpa; 需要 hibernate.validator; 需要春天 需要 spring.core; 需要 spring.context; 需要 spring.tx; 需要 spring.web; 需要 spring.webmvc; 需要 spring.datamons; 需要 spring.data.jpa; 需要 spring.boot; 需要 spring.boot.autoconfigure; 需要 cache.api;}
请注意,在该模块的配置maven-compiler-plugin和maven-surefire-plugin可以被删除。
配置未辅助的方式
如果您碰巧处于不太理想的环境中,则该过程如下:
跑 mvn clean test
分析日志中的错误以获取有问题的包
找到所述包装的JAR
如果JAR是模块,请将模块名称添加到所需模块列表中
如果没有,请计算自动模块名称,并将其添加到需要模块的列表中
例如:
[ERROR]?/ spring-petclinic / src / main / java / org / springframework / samples / petclinic / system / CacheConfig。的java: [ 21,16 ]
程序包javax.cache 不可见(错误)(javax.cache包在未命名的模块中声明,但是javax.cache 模块没有读取它)
javax.cache位于cache-api-1.0.0.jar。这不是一个模块,因为module-infoJAR中没有。自动模块名称为cache.api。把它写成requires模块中的一个。冲洗并重复。
ASM故障
自从这篇文章的第一部分,我已经意识到,Spring Boot 1.5将不会与Java 9兼容。我们开始做吧。
将弹簧引导到2.0.0.M5需要对模块依赖性进行一些更改:
hibernate.validator 至 org.hibernate.validator
validation.api 至 java.validation
只要你认为它可能工作:
造成 的:java的.lang timeException
在 组织.springframework .ASM .ClassVisitor .visitModule(ClassVisitor 的.java :148)
这个问题已经记录在案。此时,明确声明主类可解决问题。
< 插件 >
< 的groupId > org.springframework.boot
< artifactId的 >弹簧引导行家-插件
< 配置 >
< jvmArguments > --add模块java.xml.bind
< mainClass > org.springframework.samples.petclinic.PetClinicApplication
...
Javassist失败
该应用程序现在已经准备好进行测试了mvn clean spring-boot:run。不幸的是,我们有一个新的例外:
2021 -10 -16 17:20:22.552 INFO 45661 --- [main] utoConfigurationReportLoggingInitializer:启动ApplicationContext时出错。为了显示汽车构型的报告重新运行你的应用程序与 启用“调试”。2021 -10 -16 17:20:22.561 错误 45661 --- [main] osboot.SpringApplication:
应用启动失败org.springframework.beans.factory.BeanCreationException:
错误创建豆与名'的entityManagerFactory'在类路径资源定义
[组织/ springframework的的/ boot /自动配置/ ORM / JPA / HibernateJpaAutoConfiguration。班级 ]:
调用的 init方法失败; 嵌套异常是 org.hibernate.boot.archive.spi.ArchiveException:
能不能建立ClassFile的
快速搜索重定向到Java 9和Javassist之间的不兼容性。Javassist是这里的罪魁祸首。依赖关系需要Spring Data JPA,通过Hibernate传递。要解决它,排除依赖关系,并添加最新版本:
< dependency >
< groupId > org.springframework.boot
< artifactId > spring-boot-starter-data-jpa
< 排除 >
< 排除 >
< artifactId > javassist
< groupId > org。了Javassist
< 依赖性 >
< 的groupId > org.javassist
< artifactId的 >了Javassist
< 版本 > 3.22.0-GA
< scope > runtime
幸运的是,版本是兼容的 - 至少对于我们的使用。
有用!
我们做到了!如果你到达这一点,你应该在肩上轻拍,一杯啤酒,或任何你认为应得的东西。
在蛋糕上结冰,可以重新添加开发工具依赖关系。
结论
迁移到Java 9需要使用拼图,无论你喜欢还是不喜欢。至少这意味着一个痛苦的试验和错误搜索 - 下一个修复过程,并删除构建过程中的重要步骤。尽管图书馆/框架开发人员对其内部API添加了一个额外的访问控制层也是非常有趣的,但对于应用程序来说,这一点更是如此。在这个阶段,不值得转移到Java 9。
我希望在几个月后再次进行这个实验,并注意到情况有所改善。
1、具有1-5工作经验的,面对目前流行的技术不知从何下手,
需要突破技术瓶颈的。2、在公司待久了,过得很安逸,
但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的。
3、如果没有工作经验,但基础非常扎实,对java工作机制,
常用设计思想,常用java开发框架掌握熟练的。
4、觉得自己很牛B,一般需求都能搞定。
但是所学的知识点没有系统化,很难在技术领域继续突破的。

浙公网安备 33010602011771号