Java Gradle在创建工件时不包含一个依赖项

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

我在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.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
}