我的问题:如何为gradle build
设置模块路径?
我已经很习惯从命令行使用Java模块。我经常在Powershell中进行练习,从而生成这些源文件。
└───src
├───appMod
│ │ module-info.java
│ │
│ └───appPack
│ Entry.java
│
└───greetMod
│ module-info.java
│
└───greetPack
Hello.java
module appMod {
requires greetMod;
}
package appPack;
import greetPack.Hello;
public class Entry {
public static void main(String[] args) {
System.out.println(new Hello().sayHello());
}
}
module greetMod {
exports greetPack;
}
package greetPack;
public class Hello {
public String sayHello() {
return "Greetings from Hello class!";
}
}
由于appMod模块需要greetMod,所以我先编译并打包greetMod。
javac -d out/greetMod src/greetMod/module-info.java src/greetMod/greetPack/Hello.java;
jar cf lib/greetJar.jar -C out/greetMod .;
然后我编译并打包appMod,但是我指定了模块路径(-p),可在其中找到新的greetMod jar(greetJar)(在lib中)。
javac -d out/appMod -p lib src/appMod/module-info.java src/appMod/appPack/Entry.java;
jar cfe lib/appJar.jar appPack.Entry -C out/appMod .;
然后我可以通过添加模块路径来部分运行或链接它。
java -p lib -m appMod;
jlink -p lib --add-modules appMod --launcher launch=appMod --output dist;
dist/bin/launch
我现在想在Gradle中进行相同的练习,但是我不知道如何等效于设置模块路径,例如-p lib
。我看过sourceSets的代码,以及dependencies的无数变种,但是到目前为止,我还无法将所有有效的东西放在一起。我还阅读了相互矛盾的声明,它们都说Gradle doesn't fully support Java modules和Gradle does support them。
我知道这可能会造成混淆,但是绝对可以通过gradle完成。您将需要使用多项目构建来完成这项工作。在最顶部的build.gradle
中,执行以下操作:
subprojects {
apply plugin: 'java'
sourceCompatibility = 1.9
compileJava {
doFirst {
options.compilerArgs += [
'--module-path', classpath.asPath
]
classpath = files()
}
}
}
在您的settings.gradle
中:
rootProject.name = 'module-testing'
include 'src:greetMod'
include 'src:appMod'
appMod
中的所有内容都应移到名为appModSrc
的文件夹中。对greetMod
执行相同操作,因此请使用greetModSrc
。
目录结构:
├── build.gradle
└── greetModSrc
├── greetPack
│ └── Hello.java
└── module-info.java
sourceSets {
main {
java {
srcDirs 'greetModSrc'
}
}
}
目录结构:
├── appModSrc
│ ├── appPack
│ │ └── Entry.java
│ └── module-info.java
└── build.gradle
plugins {
id 'application'
}
sourceSets {
main {
java {
srcDirs 'appModSrc'
}
}
}
application {
mainClassName 'appPack.Entry'
}
jar {
doFirst {
manifest {
attributes('ModuleMainClass': mainClassName)
}
}
}
dependencies {
implementation project(':src:greetMod')
}
使用此设置,您可以简单地运行./gradlew :src:appMod:run
:
> Task :src:appMod:run
Greetings from Hello class!