Java 渐变传递依赖项不起作用?

Java 渐变传递依赖项不起作用?,java,maven,gradle,dependency-management,transitive-dependency,Java,Maven,Gradle,Dependency Management,Transitive Dependency,因此,我有一个项目,具有以下build.gradle: // PLUGINS plugins { id 'java' // or 'groovy' Must be explicitly applied id 'com.github.johnrengelman.shadow' version '1.2.2' } apply plugin: 'application' apply plugin: 'java' // REPOSITORIES & DEPENDENCIES re

因此,我有一个项目,具有以下build.gradle:

// PLUGINS

plugins {
  id 'java' // or 'groovy' Must be explicitly applied
  id 'com.github.johnrengelman.shadow' version '1.2.2'
}

apply plugin: 'application'
apply plugin: 'java'

// REPOSITORIES & DEPENDENCIES

repositories {
    mavenCentral()
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'joda-time:joda-time:2.9'
    compile 'com.miglayout:miglayout-swing:5.0'
    compile 'com.dorkbox:SystemTray:1.9'
    compile 'com.dorkbox:SystemTray-Dorkbox-Util:1.9'
    compile 'net.java.dev.jna:jna:4.2.1'
    compile 'org.slf4j:slf4j-simple:1.7.5'
    compile 'commons-cli:commons-cli:1.3.1'
}

// SETTING THE MAIN CLASS

mainClassName = "com.github.tgharib.Program"

jar {
    manifest {
        attributes 'Main-Class': 'com.github.tgharib.Program'
    }
}
目前,遵循这些步骤可以很好地编译应用程序。但是,对于
com.dorkbox:SystemTray
库,我必须包含SystemTray的可传递依赖项:
net.java.dev.jna:jna
org.slf4j:slf4j simple
。如果我理解正确,Gradle默认会自动包含可传递依赖项,但如果我删除
compile'net.java.dev.jna:jna:4.2.1'
行,例如,我的程序仍然可以编译,但无法运行(因为jna是运行时依赖项)

我花了大约3个小时试图修复它,但我一直无法解决它。一位SO用户建议清除缓存,因为这为他解决了问题,但清除缓存并不能解决问题。我还学习了
gradle dependencies
命令。以下是输出:

:dependencies

------------------------------------------------------------
Root project
------------------------------------------------------------

archives - Configuration for archive artifacts.
No dependencies

compile - Compile classpath for source set 'main'.
+--- joda-time:joda-time:2.9
+--- com.miglayout:miglayout-swing:5.0
|    \--- com.miglayout:miglayout-core:5.0
+--- com.dorkbox:SystemTray:1.9
|    +--- org.slf4j:slf4j-api:1.6.4 -> 1.7.5
|    \--- net.java.dev.jna:jna:4.2.1
+--- com.dorkbox:SystemTray-Dorkbox-Util:1.9
|    \--- net.java.dev.jna:jna:4.2.1
+--- org.slf4j:slf4j-simple:1.7.5
|    \--- org.slf4j:slf4j-api:1.7.5
\--- commons-cli:commons-cli:1.3.1

default - Configuration for default artifacts.
+--- joda-time:joda-time:2.9
+--- com.miglayout:miglayout-swing:5.0
|    \--- com.miglayout:miglayout-core:5.0
+--- com.dorkbox:SystemTray:1.9
|    +--- org.slf4j:slf4j-api:1.6.4 -> 1.7.5
|    \--- net.java.dev.jna:jna:4.2.1
+--- com.dorkbox:SystemTray-Dorkbox-Util:1.9
|    \--- net.java.dev.jna:jna:4.2.1
+--- org.slf4j:slf4j-simple:1.7.5
|    \--- org.slf4j:slf4j-api:1.7.5
\--- commons-cli:commons-cli:1.3.1

runtime - Runtime classpath for source set 'main'.
+--- joda-time:joda-time:2.9
+--- com.miglayout:miglayout-swing:5.0
|    \--- com.miglayout:miglayout-core:5.0
+--- com.dorkbox:SystemTray:1.9
|    +--- org.slf4j:slf4j-api:1.6.4 -> 1.7.5
|    \--- net.java.dev.jna:jna:4.2.1
+--- com.dorkbox:SystemTray-Dorkbox-Util:1.9
|    \--- net.java.dev.jna:jna:4.2.1
+--- org.slf4j:slf4j-simple:1.7.5
|    \--- org.slf4j:slf4j-api:1.7.5
\--- commons-cli:commons-cli:1.3.1

shadow
No dependencies

testCompile - Compile classpath for source set 'test'.
+--- joda-time:joda-time:2.9
+--- com.miglayout:miglayout-swing:5.0
|    \--- com.miglayout:miglayout-core:5.0
+--- com.dorkbox:SystemTray:1.9
|    +--- org.slf4j:slf4j-api:1.6.4 -> 1.7.5
|    \--- net.java.dev.jna:jna:4.2.1
+--- com.dorkbox:SystemTray-Dorkbox-Util:1.9
|    \--- net.java.dev.jna:jna:4.2.1
+--- org.slf4j:slf4j-simple:1.7.5
|    \--- org.slf4j:slf4j-api:1.7.5
\--- commons-cli:commons-cli:1.3.1

testRuntime - Runtime classpath for source set 'test'.
+--- joda-time:joda-time:2.9
+--- com.miglayout:miglayout-swing:5.0
|    \--- com.miglayout:miglayout-core:5.0
+--- com.dorkbox:SystemTray:1.9
|    +--- org.slf4j:slf4j-api:1.6.4 -> 1.7.5
|    \--- net.java.dev.jna:jna:4.2.1
+--- com.dorkbox:SystemTray-Dorkbox-Util:1.9
|    \--- net.java.dev.jna:jna:4.2.1
+--- org.slf4j:slf4j-simple:1.7.5
|    \--- org.slf4j:slf4j-api:1.7.5
\--- commons-cli:commons-cli:1.3.1

(*) - dependencies omitted (listed previously)

BUILD SUCCESSFUL

Total time: 4.544 secs

如您所见,SystemTray确实将JNA作为依赖项包括在内,但如果我在主项目中删除JNA依赖项,它将无法运行。

它最终导致pom文件上游出现问题。他们将依赖项从编译时依赖项切换到运行时依赖项,并将其修复。

您是否尝试使用-d(debug)选项查看实际发生的情况?另外,您使用什么命令来构建jar?@AdamSkywalker为了构建jar,我使用了命令
gradleshadowjar
。但是,即使是
等级运行
,也会出现同样的问题。如果我将JNA作为依赖项包含,
gradle-run
可以很好地运行它,但是如果我不包含JNA,
gradle-run
会抛出一个运行时依赖项。这是
gradle-d run
的输出,没有
编译'net.java.dev.jna:jna:4.2.1'
行:看起来这些是相关的行:因此它似乎正在获取jna,但程序无法运行,嗯,尝试gradle构建shadowJar并告诉它是否工作我遇到了同样的问题,你能给我更多细节吗?