Gradle 构建 - 添加模块路径

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)

appMod/模块信息

module appMod {
    requires greetMod;
}
Run Code Online (Sandbox Code Playgroud)

appMod/appPack.Entry

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)

问候Mod/模块信息

module greetMod {
    exports greetPack;
}
Run Code Online (Sandbox Code Playgroud)

greetMod/greetPack.Hello

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 确实支持它们

sma*_*c89 6

我知道这可能会令人困惑,但它绝对可以通过 gradle 来完成。您将需要使用多项目构建来完成这项工作。在最顶层build.gradle,执行以下操作:

\n
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}\n
Run Code Online (Sandbox Code Playgroud)\n

在你的settings.gradle

\n
rootProject.name = \'module-testing\'\n\ninclude \'src:greetMod\'\ninclude \'src:appMod\'\n
Run Code Online (Sandbox Code Playgroud)\n

里面的所有内容都appMod应该移到一个名为 的文件夹中appModSrcgreetMod对so use做同样的事情greetModSrc

\n
\n

问候模块

\n

目录结构:

\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\n
Run Code Online (Sandbox Code Playgroud)\n

构建.gradle

\n
sourceSets {\n    main {\n        java {\n            srcDirs \'greetModSrc\'\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n
\n

应用模块

\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\n
Run Code Online (Sandbox Code Playgroud)\n

构建.gradle

\n
plugins {\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}\n
Run Code Online (Sandbox Code Playgroud)\n
\n

通过此设置,您只需运行./gradlew :src:appMod:run

\n
> Task :src:appMod:run\nGreetings from Hello class!\n
Run Code Online (Sandbox Code Playgroud)\n

您可以在这里下载想法项目:https ://github.com/MVCE-Superstars/multi-java9-gradle

\n