我的问题:如何为 gradle build
设置模块路径?
我已经习惯了从命令行使用 Java 模块。我经常在 Powershell 中进行练习,从而生成这些源文件。
└───src
├───appMod
│ │ module-info.java
│ │
│ └───appPack
│ Entry.java
│
└───greetMod
│ module-info.java
│
└───greetPack
Hello.java
appMod/模块信息
module appMod {
requires greetMod;
}
appMod/appPack.Entry
package appPack;
import greetPack.Hello;
public class Entry {
public static void main(String[] args) {
System.out.println(new Hello().sayHello());
}
}
GreetMod/模块信息
module greetMod {
exports greetPack;
}
greetMod/greetPack.Hello
package greetPack;
public class Hello {
public String sayHello() {
return "Greetings from Hello class!";
}
}
由于 appMod 模块需要 greetMod,所以我先编译并 jar greetMod。
javac -d out/greetMod src/greetMod/module-info.java src/greetMod/greetPack/Hello.java;
jar cf lib/greetJar.jar -C out/greetMod .;
然后我编译并 jar appMod,但是当我这样做时,我指定了可以找到新的 greetMod jar (greetJar) 的模块路径 (-p) (在 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
构建.gradlesourceSets {
main {
java {
srcDirs 'greetModSrc'
}
}
}
应用模组
目录结构:
├── appModSrc
│ ├── appPack
│ │ └── Entry.java
│ └── module-info.java
└── build.gradle
构建.gradleplugins {
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!
你可以在这里下载idea项目:https://github.com/MVCE-Superstars/multi-java9-gradle
关于java - Gradle build - 添加模块路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58708213/