【问题标题】:Shaded jar Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/data/jpa]阴影 jar 无法找到 XML 模式命名空间的 Spring NamespaceHandler [http://www.springframework.org/schema/data/jpa]
【发布时间】:2019-08-08 20:24:54
【问题描述】:
当我使用 maven-shaded-plugin 将我的所有依赖项(包括 spring-data-jpa.jar)打包在一个 jar 中并放在 WEB-INF/lib 目录下时,我在 Tomcat 中运行的 Web 应用程序中遇到了上述异常。
如果我将 spring-data-jpa.jar 与我的阴影 jar 一起直接打包到 WEB-INF/lib 中,问题就会消失?
NOTE: I will be running the same package as AWS Lambda hence I need to create a shaded jar.
【问题讨论】:
标签:
spring-data-jpa
classpath
maven-shade-plugin
【解决方案1】:
为了帮助其他人,问题是多个 spring-*.jar 文件 META-INF/spring.handlers 文件在运行 maven-shade-plugin 时相互覆盖。
解决在插件配置中使用<transformers>。我最终的插件配置如下所示;
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<!-- Remove signatures from transitive dependencies and append spring handlers and schemas -->
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
</transformers>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
Above 会将所有处理程序合并到最终 jar 中的一个文件中。享受:-)