Я пытаюсь создать встроенный учебный инструмент с 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. Я также попробовал много ответов на этот вопрос без удачи.