我正在构建一个 super jarfile,但使用 <minimizeJar>true</minimizeJar>
进行了精简。 Maven Shade 插件的选项。
我在设置该选项时收到此错误:
$> java -jar target/lambda-send-email-1.0-SNAPSHOT.jar
Exception in thread "main" java.lang.NoClassDefFoundError: com.amazonaws.AmazonWebServiceClient
at com.kilsbo.lambda.CreateAndSendEmail.addEmailToDynamo(CreateAndSendEmail.java:148)
at com.kilsbo.lambda.CreateAndSendEmail.handleRequest(CreateAndSendEmail.java:125)
at com.kilsbo.lambda.CreateAndSendEmail.main(CreateAndSendEmail.java:43)
但是,对于臃肿的大 jar (minimizeJar 设置为 false),它可以工作。
我已经解压了最小化的 jar,并且实际上包含了所需的类。
unzippedJar/$> file com/amazonaws/AmazonWebServiceClient.class
com/amazonaws/AmazonWebServiceClient.class: compiled Java class data, version 50.0 (Java 1.6)
所以,我认为这里存在类路径问题,但我在阅读 Maven Shade 插件文档时还没有真正找到解决方案。
我在 pom 中的插件设置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.kilsbo.lambda.CreateAndSendEmail</mainClass>
</transformer>
</transformers>
<createDependencyReducedPom>false</createDependencyReducedPom>
<minimizeJar>true</minimizeJar>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
有什么建议吗?
最佳答案
如果 com/amazonaws/AmazonWebServiceClient.class 与正在查找和执行的类文件存在于同一个 jar 中,则不存在类路径问题。类加载器找到要加载的类。
更可能的情况是找不到 AmazonWebServiceClient 依赖的某些类。不幸的是,JVM 仍然抛出这个有点误导性的错误消息。例如,检查 AmazonWebServiceClient 的源,看看它是否扩展另一个类或具有任何不在您的阴影 uber-jar 中的导入。一个常见的错误是任何
<scope>provided<scope>pom 中的依赖项将不会被遮蔽。也许 AmazonWebServiceClient 是从另一个 Amazon jar 中未被遮蔽的东西扩展而来。
关于java - 带有 minimizeJar 的 Maven Shade 插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34184072/