如何将本地Jar添加到EduTools项目

时间:2020-02-12 14:46:12

标签: java gradle jetbrains-ide

我正在尝试使用JetBrains EduTools Plugin创建一个入门培训工具,但是由于某些特殊原因,我主要依赖的jar只能在本地使用。我在将罐子包括在内时遇到了困难。通过下载Intelij的插件并创建课程,可以轻松重现该问题。当您使用插件创建一个新项目时,它将创建以下文件结构:

.
├── build.gradle
├── course-info.yaml
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── lesson1
│   ├── lesson-info.yaml
│   └── task1
│       ├── src
│       │   └── Task.java
│       ├── task-info.yaml
│       ├── task.html
│       └── test
│           └── Tests.java
└── settings.gradle

我已经在根目录下创建了一个libs文件夹,并在其中放置了一个我依赖的jar。

build.gradle文件如下所示:

buildscript {
    repositories {
        mavenCentral()
    }
}

def printOutput(def output) {
    return tasks.create("printOutput") {
        for (line in output.toString().readLines()) {
            println "#educational_plugin" + line
        }
    }
}

subprojects {
    apply plugin: 'application'
    apply plugin: 'java'

    sourceCompatibility = 1.8

    repositories {
        mavenCentral()
    }

    dependencies {
        testCompile group: 'junit', name: 'junit', version: '4.12'
    }

    sourceSets {
        main {
            java.srcDir 'src'
        }
        test {
            java.srcDir 'test'
        }
    }

    mainClassName = project.hasProperty("mainClass") ? project.getProperty("mainClass") : ""

    def runOutput = new ByteArrayOutputStream()
    tasks.run.setStandardOutput(runOutput)
    tasks.run.doLast { printOutput(runOutput) }
}

project(':util') {
    dependencies {
        compile group: 'junit', name: 'junit', version: '4.12'
    }
}

configure(subprojects.findAll {it.name != 'util'}) {
  dependencies {
    compile project(':util').sourceSets.main.output
    testCompile project(':util').sourceSets.test.output
  }
}

settings.gradle

// Should be the same as `com.jetbrains.edu.learning.courseGeneration.GeneratorUtils.sanitizeName`
static String sanitizeName(String name) {
    return name.replaceAll("[ /\\\\:<>\"?*|()]", "_")
}

rootProject.name = 'demo-onboarding'

rootProject.projectDir.eachDirRecurse {
    if (!isTaskDir(it) || it.path.contains(".idea")) {
        return
    }
    def taskRelativePath = rootDir.toPath().relativize(it.toPath())
    def parts = []
    for (name in taskRelativePath) {
        parts.add(sanitizeName(name.toString()))
    }
    def moduleName =  parts.join("-")
    include "$moduleName"
    project(":$moduleName").projectDir = it
}

def isTaskDir(File dir) {
    return new File(dir, "src").exists()
}

include 'util'

我尝试了以下操作:

subprojects {
    ...
    dependencies {
        compile fileTree(include: ['*.jar'], dir: 'libs')
        testCompile group: 'junit', name: 'junit', version: '4.12'
    }
    ...
}

和:

configure(subprojects.findAll {it.name != 'util'}) {
  dependencies {
      compile project(':util').sourceSets.main.output
      compile fileTree(include: ['*.jar'], dir: 'libs')
      testCompile project(':util').sourceSets.test.output
  }
}

这两个配置的构建都没有任何抱怨,但是当我尝试从Task.java中的jar导入类时,构建失败,并出现编译错误。我已经测试过:

compile fileTree(include: ['*.jar'], dir: 'libs')

在一个简单的Java gradle项目中,它可以正常工作,但似乎不适用于EduTools项目的配置。在此question中,我也尝试过很多答案,但是没有运气。

0 个答案:

没有答案
相关问题