Gradle 依赖项未列出本地 maven jar 的依赖项

Posted

技术标签:

【中文标题】Gradle 依赖项未列出本地 maven jar 的依赖项【英文标题】:Gradle dependencies not listing dependencies of local maven jar 【发布时间】:2019-04-08 07:30:16 【问题描述】:

我正在使用 Gradle 构建系统开发一个 IntelliJ 插件。这个插件使用一个通用模型,它是一个 maven 项目。

我已将 mavenLocal 包含在我的 gradle 存储库中,并且还在“依赖项”中添加了编译时依赖项。

代码编译正常,但运行时出现 java.lang.NoClassDefFoundError。当我检查 gradle 中的依赖项时,它没有列出本地 maven jar(模型库)的所有依赖项。

下面是我的 build.gradle 的精简版

plugins 
    id 'java'
    id 'org.jetbrains.intellij' version '0.4.1'
    id 'maven'

group 'oracle.nosql'

repositories 
    //mavenCentral()
    mavenLocal()

dependencies 
    compile 'oracle.nosql:oracle.nosql.model.common:1.0.0' //this is maven lib
    compile 'oracle.nosql:oracle.nosql.model.cloud:1.0.0' //this is maven lib

apply plugin: 'maven'

下面是gradle dependencies的输出

compileClasspath - Compile classpath for source set 'main'.M
+--- oracle.nosql:oracle.nosql.model.common:1.0.0M
+--- oracle.nosql:oracle.nosql.model.cloud:1.0.0M
|    \--- com.fasterxml.jackson.core:jackson-databind:2.9.7M
|         +--- com.fasterxml.jackson.core:jackson-annotations:2.9.0M
|         \--- com.fasterxml.jackson.core:jackson-core:2.9.7M
\--- com.jetbrains:ideaIC:2018.3.2M

但是在maven中对于模型的依赖是不同的。

    mvn dependency:build-classpath

    oracle.nosql.model.cloud ---
    [INFO] Dependencies classpath:
    ...\.m2\repository\oracle\nosql\oracle.nosql.model.common\1.0.0\oracle.nosql.model.common-1.0.0.jar;
D:\oracle-nosql-cloud-sdk-18.298\java\lib\nosqldriver.jar;
...\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.9.7\jackson-databind-2.9.7.jar;...\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.9.0\jackson-annotations-2.9.0.jar;...\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.9.7\jackson-core-2.9.7.jar;...\.m2\repository\junit\junit\4.12\junit-4.12.jar;

尤其是 gradle 依赖项中缺少 D:\oracle-nosql-cloud-sdk-18.298\java\lib\nosqldriver.jar

我认为这是导致 java.lang.NoClassDefFoundError 的原因。

【问题讨论】:

你确定build.gradle中的依赖列表和pom.xml中定义的一样吗? @DrHopfen 我是否还需要在 build.gradle 中包含 pom.xml 的依赖项?但在这里它是从像杰克逊这样的 pom 的传递依赖中解决的? Gradle 也在解决传递依赖。但是,如果您需要的 jar 是 build.gradle 中未提及的工件的直接或传递依赖项,您将面临所描述的问题。 【参考方案1】:

鉴于 D:\oracle-nosql-cloud-sdk-18.298\java\lib\nosqldriver.jar 的绝对路径,我假设您在 Maven 库中声明了一个 system 依赖项。

对于 compileClasspathruntimeClasspath 分辨率,Gradle 不包含这些依赖项。

您必须将此依赖项作为文件依赖项添加回 Gradle 构建中。

【讨论】:

是的,jar 是 maven 中的系统范围依赖。正如您所建议的那样,我使用“ compile files('D:\\oracle-nosql-cloud-sdk-18.298\\java\\lib\\nosqldriver.jar') ”添加了文件依赖项,但这是添加 nosqldriver.jar到最终的插件 jar。但我不想在最终包中包含 nosqldriver.jar,用户通过 GUI 提供此路径。

以上是关于Gradle 依赖项未列出本地 maven jar 的依赖项的主要内容,如果未能解决你的问题,请参考以下文章

Maven依赖的是本地工程还是仓库jar包

Android Gradle 插件将自定义 Gradle 插件上传到自建 Maven 仓库 ③ ( 配置上传工件 | 将 Gradle 插件 jar 包源码文档上传到本地Maven 仓库 )

Gradle javax.jms 依赖项未下载

项目添加外部jar依赖(本地仓库方式)

gradle 添加jar依赖,执行grade build时出现“程序包不存在”问题

gradle 初了解