【问题标题】:gradle does not import local java librariesgradle 不导入本地 java 库
【发布时间】:2022-01-20 10:24:22
【问题描述】:

我有以下文件夹结构:

-bin

-build/build.gradle(gradle 脚本)

-lib/[*.jar](项目正在使用的库)

-src/folder/folder/[*.java](项目源代码)

build.gradle 脚本的以下内容:

plugins {
    id 'java'
    id 'groovy'
}

buildDir = new File('../bin') 
sourceCompatibility = JavaVersion.VERSION_1_8 

sourceSets { 
    main { 
        java { 
            allJava.srcDirs = [ '../src/folder/folder/ '] 
            compileClasspath = fileTree('../bin') 
        } 
    } 
} 

repositories {
    flatDir {
        dirs '../lib'
    }
}

dependencies {
    implementation fileTree('../lib')
}

tasks.register('javac', JavaCompile) { 
    println 'Call javac' 
    source.forEach { e -> println e} 

    classpath = sourceSets.main.compileClasspath 
    destinationDirectory = file('../bin') 
    source sourceSets.main.allJava.srcDirs 
    includes.add('*.java') 
    sourceCompatibility = JavaVersion.VERSION_1_8 
}

运行gradle javac 时出现错误: error: cannot find symbol import com...

文件清楚地写着:

dependencies {
.
.
.
    //putting all jars from 'libs' onto compile classpath
    implementation fileTree('libs')
}

我正在使用 Gradle 7.3.1

【问题讨论】:

  • 安全地假设您的folder/folder 实际上是与您的import 语句匹配的com/.../?您从哪个目录运行 Gradle?它是否解释相对于当前目录或build.gradle 的相对路径?如果您从顶级目录运行,请尝试从 implementation fileTree('../lib') 等路径中删除 ../
  • 是的,这些路径仅作为示例。我尝试了绝对路径和相对路径,但没有成功......

标签: java gradle


【解决方案1】:

请允许我先给您一些一般性建议。 我强烈推荐使用 Kotlin DSL 而不是 Groovy DSL。 您可以立即在构建脚本中获得强类型代码和更好的 IDE 支持。

另外,恕我直言,您应该考虑将项目布局更改为更像大多数其他 Java 项目,尤其是不要使用 libs 目录,而是在存储库中使用普通依赖项,然后自动处理传递依赖项等等。

但要回答您的实际问题,这是您想要的 Groovy DSL 中的构建完整构建脚本:

plugins {
    id 'java'
}

buildDir = '../bin'

java {
    toolchain {
        languageVersion.set(JavaLanguageVersion.of(8))
    }
}

sourceSets {
    main {
        java {
            srcDirs = ['../src/folder/folder']
        }
    }
}

dependencies {
    implementation fileTree('../lib')
}

这是匹配的 Kotlin DSL 版本:

plugins {
    java
}

setBuildDir("../bin")

java {
    toolchain {
        languageVersion.set(JavaLanguageVersion.of(8))
    }
}

sourceSets {
    main {
        java {
            setSrcDirs(listOf("../src/folder/folder"))
        }
    }
}

dependencies {
    implementation(fileTree("../lib"))
}

【讨论】:

  • 不幸的是,更改布局不是一种选择......不过我会尝试切换到 kotlin。我必须指出的一件事:将JavaLanguageVersion 设置为 8 不起作用。我必须在JavaCompile 任务中设置options.release = 8 属性。我认为java sourceSets 中的srcDirs 方法看起来只有一层,但我有3 层文件夹,所以我必须将它们全部包含在内。是否有一个函数可以查找 java 文件,无论它们是多么嵌套?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-15
  • 1970-01-01
  • 2022-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多