Java Gradle在创建工件时不包含一个依赖项
我在IntelliJ项目中使用Gradle管理Spring项目中的依赖项,以提供REST web服务。只要我在IDE中运行该项目,它就可以正常工作,但是如果我执行Java Gradle在创建工件时不包含一个依赖项,java,gradle,Java,Gradle,我在IntelliJ项目中使用Gradle管理Spring项目中的依赖项,以提供REST web服务。只要我在IDE中运行该项目,它就可以正常工作,但是如果我执行java-jar artifact.jar命令,它就无法启动。将打印以下错误 13:42:47.338 [main] WARN org.springframework.boot.SpringApplication - Unable to close ApplicationContext java.lang.IllegalStat
java-jar artifact.jar
命令,它就无法启动。将打印以下错误
13:42:47.338 [main] WARN org.springframework.boot.SpringApplication - Unable to close ApplicationContext
java.lang.IllegalStateException: Failed to introspect Class [com.(...).web_services.JmsConfiguration] from ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader@2cdf8d8a]
at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:481)
at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:358)
at org.springframework.util.ReflectionUtils.getUniqueDeclaredMethods(ReflectionUtils.java:414)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.lambda$getTypeForFactoryMethod$2(AbstractAutowireCapableBeanFactory.java:747)
at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1705)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryMethod(AbstractAutowireCapableBeanFactory.java:746)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineTargetType(AbstractAutowireCapableBeanFactory.java:685)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:656)
at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1670)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:570)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:542)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:667)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:659)
at org.springframework.context.support.AbstractApplicationContext.getBeansOfType(AbstractApplicationContext.java:1300)
at org.springframework.boot.SpringApplication.getExitCodeFromMappedException(SpringApplication.java:914)
at org.springframework.boot.SpringApplication.getExitCodeFromException(SpringApplication.java:902)
at org.springframework.boot.SpringApplication.handleExitCode(SpringApplication.java:889)
at org.springframework.boot.SpringApplication.handleRunFailure(SpringApplication.java:830)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:349)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1340)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1329)
at com.(...).web_services.WebServicesApplication.main(WebServicesApplication.java:10)
Caused by: java.lang.NoClassDefFoundError: javax/jms/ConnectionFactory
at java.base/java.lang.Class.getDeclaredMethods0(Native Method)
at java.base/java.lang.Class.privateGetDeclaredMethods(Class.java:3166)
at java.base/java.lang.Class.getDeclaredMethods(Class.java:2309)
at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:463)
... 21 common frames omitted
Caused by: java.lang.ClassNotFoundException: javax.jms.ConnectionFactory
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 25 common frames omitted
我假设
javax.jms.ConnectionFactory
类随SpringActiveMQ包而来,我已经尝试手动更新Gradle,但这并没有解决问题。在jms类中导入javax.jms.ConnectionFactory
也没有帮助。有什么线索吗?第一次尝试是使用以下自定义gradle任务创建一个胖罐子(如@MatteoNNZ following所建议的)
task customFatJar(类型:Jar){
显示{
属性“主类”:“
}
baseName='一个罐子中的所有'
从{configurations.compile.collect{it.isDirectory()?it:zipTree(it)}
用罐子
}
但是,由于这不起作用,我运行了预定义的gradle任务buildDependents,它在
build/libs
文件夹中创建了一个working.jar。我不使用gradle,但在maven中有一个编译“胖jar”(一个包含所有依赖项的jar)的选项。我相信gradle中也有同样的问题,关于问题本身,您的jar依赖于其他一些jar(这里是javax.jms,它声明了ConnectionFactory类)。当您使用IDE时,jar已经下载到本地存储库中,并在运行时提供,因此代码运行良好。但是,当您使用java-jar运行jar时,没有依赖上下文,因此您可以在系统中的其他地方提供它们,或者(就像在您的案例中)希望您的应用程序是独立的,因此所有外部依赖项都应该物理打包在“胖”jar中,这应该是您所寻找的。@MatteoNNZ相反,如果我尝试运行胖jar,则显示的错误是线程“main”java.lang.NoClassDefFoundError:org/springframework/boot/SpringApplicationthen中的一个异常,您正在运行的不是胖jar:)如果您解压缩jar,您是否看到所有依赖项(例如,包含文件夹springframework等的文件夹组织)或者只是你项目的类?
task customFatJar(type: Jar) {
manifest {
attributes 'Main-Class': '<myPackage>.<myMainClass>'
}
baseName = 'all-in-one-jar'
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
with jar
}