Gradle build - добавить путь к модулю - PullRequest
1 голос
/ 05 ноября 2019

Мой вопрос: как мне задать путь к модулю для gradle build?

Мне стало удобно работать с модулями Java из командной строки. Я часто выполняю упражнение в Powershell, в результате которого получаются следующие исходные файлы.

└───src
    ├───appMod
    │   │   module-info.java
    │   │
    │   └───appPack
    │           Entry.java
    │
    └───greetMod
        │   module-info.java
        │
        └───greetPack
                Hello.java

appMod / module-info

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-info

module greetMod {
    exports greetPack;
}

greetMod / greetPack.Hello

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 .;

Затем я компилирую и 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 .;

Я могузатем запустите это или jlink это частично, добавив путь к модулю.

java -p lib -m appMod;
jlink -p lib --add-modules appMod --launcher launch=appMod --output dist;
dist/bin/launch

Теперь я хочу сделать то же самое упражнение в Gradle, но я не могу понять, как сделать эквивалент установки модуляпуть, такой как -p lib. Я видел код для sourceSets и бесчисленные вариации зависимостей , но до сих пор я не смог собрать что-то, что работает. Я также читал противоречивые утверждения, в которых говорится, что Gradle не полностью поддерживает модули Java и что Gradle поддерживает их .

1 Ответ

1 голос
/ 06 ноября 2019

Я знаю, что это может сбить с толку, но это определенно можно сделать с помощью 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.


greetMod

Структура каталогов:

├── build.gradle
└── greetModSrc
    ├── greetPack
    │   └── Hello.java
    └── module-info.java

build.gradle

sourceSets {
    main {
        java {
            srcDirs 'greetModSrc'
        }
    }
}

appMod

Структура каталогов:

├── appModSrc
│   ├── appPack
│   │   └── Entry.java
│   └── module-info.java
└── build.gradle

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!

Вы можете скачать проект идеи здесь: https://github.com/smac89/multi-java9-gradle

...