Jac*_*k J 5 java command-line dependencies gradle java-module
我的问题:如何设置模块路径gradle build?
我已经习惯从命令行使用 Java 模块了。我经常在 Powershell 中进行练习,从而生成这些源文件。
????src
????appMod
? ? module-info.java
? ?
? ????appPack
? Entry.java
?
????greetMod
? module-info.java
?
????greetPack
Hello.java
Run Code Online (Sandbox Code Playgroud)
module appMod {
requires greetMod;
}
Run Code Online (Sandbox Code Playgroud)
package appPack;
import greetPack.Hello;
public class Entry {
public static void main(String[] args) {
System.out.println(new Hello().sayHello());
}
}
Run Code Online (Sandbox Code Playgroud)
module greetMod {
exports greetPack;
}
Run Code Online (Sandbox Code Playgroud)
package greetPack;
public class Hello {
public String sayHello() {
return "Greetings from Hello class!";
}
}
Run Code Online (Sandbox Code Playgroud)
由于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 .;
Run Code Online (Sandbox Code Playgroud)
然后我编译和 jar 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 .;
Run Code Online (Sandbox Code Playgroud)
然后我可以通过添加模块路径来部分运行或 jlink 它。
java -p lib -m appMod;
jlink -p lib --add-modules appMod --launcher launch=appMod --output dist;
dist/bin/launch
Run Code Online (Sandbox Code Playgroud)
我现在想在 Gradle 中做同样的练习,但我无法弄清楚如何设置模块路径,例如-p lib. 我已经看过sourceSets 的代码,以及无数的dependencies变体,但到目前为止我还没有能够把一些有用的东西放在一起。我还读过一些相互矛盾的陈述,它们都说Gradle 不完全支持 Java 模块,而Gradle 确实支持它们。
我知道这可能会令人困惑,但它绝对可以通过 gradle 来完成。您将需要使用多项目构建来完成这项工作。在最顶层build.gradle,执行以下操作:
subprojects {\n apply plugin: \'java\'\n\n sourceCompatibility = 1.9\n\n compileJava {\n doFirst {\n options.compilerArgs += [\n \'--module-path\', classpath.asPath\n ]\n classpath = files()\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n在你的settings.gradle:
rootProject.name = \'module-testing\'\n\ninclude \'src:greetMod\'\ninclude \'src:appMod\'\nRun Code Online (Sandbox Code Playgroud)\n里面的所有内容都appMod应该移到一个名为 的文件夹中appModSrc。greetMod对so use做同样的事情greetModSrc。
目录结构:
\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 build.gradle\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 greetModSrc\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 greetPack\n \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 Hello.java\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 module-info.java\nRun Code Online (Sandbox Code Playgroud)\nsourceSets {\n main {\n java {\n srcDirs \'greetModSrc\'\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n目录结构:
\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 appModSrc\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 appPack\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 Entry.java\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 module-info.java\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 build.gradle\nRun Code Online (Sandbox Code Playgroud)\nplugins {\n id \'application\'\n}\n\nsourceSets {\n main {\n java {\n srcDirs \'appModSrc\'\n }\n }\n}\n\napplication {\n mainClassName \'appPack.Entry\'\n}\n\njar {\n doFirst {\n manifest {\n attributes(\'ModuleMainClass\': mainClassName)\n }\n }\n}\n\ndependencies {\n implementation project(\':src:greetMod\')\n}\nRun Code Online (Sandbox Code Playgroud)\n通过此设置,您只需运行./gradlew :src:appMod:run:
> Task :src:appMod:run\nGreetings from Hello class!\nRun Code Online (Sandbox Code Playgroud)\n您可以在这里下载想法项目:https ://github.com/MVCE-Superstars/multi-java9-gradle
\n| 归档时间: |
|
| 查看次数: |
4457 次 |
| 最近记录: |