我正在尝试使用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中,我也尝试过很多答案,但是没有运气。