Maven 从 WAR 中排除配置处理器包

Posted

技术标签:

【中文标题】Maven 从 WAR 中排除配置处理器包【英文标题】:Maven excludes the configuration processor package from the WAR 【发布时间】:2022-01-18 20:21:21 【问题描述】:

spring-boot版本从2.1.8.RELEASE升级到2.5.6后,spring-boot-configuration-processor包升级到了。运行 WAR 时,我们得到下面的异常,它找不到类,实际上 WAR 不包含此包的 JAR(spring-boot-configuration-processor)。

作为解决方法,我们已将此包降级为 2.3.12.RELEASE,它可以在运行时运行。我们已尝试使用 2.3.6 / 2.4.14 / 2.4.7 / 2.4.0 版本,但 jar 不包含在 WAR 中。

据我了解,该包由 IDE 使用,所以我的问题是:为什么在运行时需要它?它应该包含在我的 WAR 中吗? Maven 如何决定从 WAR 中排除包?

Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name appointmentRepository defined in com.project.project.repositories.AppointmentRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Cannot create inner bean (inner bean)#37291159 of type [org.springframework.orm.jpa.SharedEntityManagerCreator] while setting bean property entityManager; 
nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name (inner bean)#37291159: Cannot resolve reference to bean entityManagerFactory while setting constructor argument; 
nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name entityManagerFactory defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: org.springframework.boot.configurationprocessor.json.JSONException

application.properties:

com.project.file.maximumSize=5242880
com.project.file.contentTypes=application/pdf,image/png,image/jpeg
com.project.file.extensions=pdf,png,jpeg,jpg
com.project.file.maxFilesPerAttachmentType=5

附加-spring-configuration-metadata.json

"properties": [
  
    "name": "com.project.file.maximum-size",
    "type": "java.lang.Long",
    "description": "Sets the maximum valid size, in Bytes, for the uploaded attachments."
  ,
  
    "name": "com.project.file.content-types",
    "type": "java.util.List<java.lang.String>",
    "description": "A list of the authorized content types for the uploaded attachments."
  ,
  
    "name": "com.project.file.extensions",
    "type": "java.util.List<java.lang.String>",
    "description": "A list of the authorized extensions."
  
]

【问题讨论】:

你能发布你的 pom 文件吗?那是 Maven 用来配置构建的文件(可能在那里发现错误) 我找到了根本原因,我是从 org.springframework.boot.configurationprocessor.json 而不是 org.json 导入 JSONObject 和 JSONException ,这就是在运行时调用它的原因。谢谢@JensBaitinger 【参考方案1】:

在 x.x.x.RELEASE 之前最旧版本的 springframework.boot.configurationprocessor 是在默认范围编译,这就是它包含在 WEB-INF\lib 中的原因,并且不会导致 classnotFoundException。我升级了配置处理器包的版本,并将我的 JSONObject 和 JSONException 导入更改为 json.org。

【讨论】:

以上是关于Maven 从 WAR 中排除配置处理器包的主要内容,如果未能解决你的问题,请参考以下文章

maven把java项目打包,如何把配置文件提出来

如何从war maven程序集中排除包含文件的文件夹

Maven -- 在进行war打包时排除不需要的文件

MAVEN 排除第三方jar

maven pom 怎么从jar包里面排除一个类

使用maven打包指定目录