Как добавить локальный Jar в проект EduTools - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь создать встроенный учебный инструмент с JetBrains EduTools Plugin , но по определенным причинам банки, от которых я буду зависеть в основном, доступны только локально. У меня возникли трудности, включая банки в сборке. Эту проблему легко воспроизвести, загрузив плагин для 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 в root и поместил в нее банку, от которой я зависел.

Файл 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
  }
}

Обе эти конфигурации создаются без каких-либо жалоб, но когда я пытаюсь импортировать классы из jar в Task.java, сборка завершается с ошибкой компиляции. Я протестировал:

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

в простом java проекте Gradle, и он работает нормально, но, похоже, не работает с конфигурацией проекта EduTools. Я также попробовал много ответов на этот вопрос без удачи.

...