【问题标题】:Gradle dependencies not listing dependencies of local maven jarGradle 依赖项未列出本地 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 中未提及的工件的直接或传递依赖项,您将面临所描述的问题。

标签: java maven 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 提供此路径。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-20
  • 2017-06-09
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
  • 2012-11-18
相关资源
最近更新 更多