java - Gradle build - 添加模块路径

标签 java gradle command-line dependencies java-module

我的问题:如何为 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
构建.gradle
sourceSets {
    main {
        java {
            srcDirs 'greetModSrc'
        }
    }
}

应用模组
目录结构:
├── appModSrc
│   ├── appPack
│   │   └── Entry.java
│   └── module-info.java
└── build.gradle
构建.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!
你可以在这里下载idea项目:https://github.com/MVCE-Superstars/multi-java9-gradle

关于java - Gradle build - 添加模块路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58708213/

相关文章:

java - 使用 JavaFX 11 的自定义 JRE

java - 如何复制格式为“bucketName/folder1/folder2”的存储桶的内容

postgresql - 在 PSQL 上进行基本查询不显示任何内容

windows - 输入为 dshow 时 ffmpeg 不停止

c# - 以编程方式将 WXS 构建到 MSI 中

java - 如何使用 Java 将自定义数据写入 TCP 数据包头选项字段?

java - cxf 将源文件放在目标中但编译器看不到它们?

java - Android Gradle 同步失败 : Could not resolve all artifacts for configuration ':classpath'

Android 错误导入引用 R 资源的库

android - 虽然 Android Studio 更新到 v3.3 获取 API 'variant.getAssemble()' 已过时并已替换为 'variant.getAssembleProvider()'