конфигурация api плагина java-библиотеки не распознается

Я новичок в Gradle, и я использую Gradle 6.1.
Я пишу небольшое приложение, чтобы понять концепции многопроектного приложения и плагина Java-библиотеки Gradle.

Мой вопрос:

  1. Как App.java отлично работает без импорта класса DefaultRandomGenerator из SubProject-2

  2. Почему я получаю сообщение об ошибке "Не найдено кандидатов для api вызова метода" в файле build.grade родительского проекта (MultiProjectApp).


Ниже приведен код моего приложения:


Файлы родительского проекта (MultiProjectApp)


settings.gradle

rootProject.name = 'MultiProjectApp'
include 'SubProject-1'
include 'SubProject-2'

build.gradle

allprojects {
    apply plugin: 'java'

    group 'org.example'
    version '1.0-SNAPSHOT'

    sourceCompatibility = 1.8
    targetCompatibility = 1.8

    repositories {
        mavenCentral()
    }

}
project(':SubProject-1') {

    dependencies {
        implementation project(':SubProject-2')
    }
}

project(':SubProject-2') {
    apply plugin: 'java-library'

    dependencies {
        api 'org.apache.commons:commons-math3:3.2'
        implementation 'org.apache.logging.log4j:log4j-core:2.5'
        testImplementation "junit:junit:4.12"
    }
}


Файлы Субпроекта-2


build.gradle

Empty file

RandomGenerator.java

package org.examples;

public interface RandomGenerator {

    String name();
    int generate();
}

DefaultRandomGenerator.java

package org.examples;

import org.apache.commons.math3.random.RandomDataGenerator;

public class DefaultRandomGenerator implements RandomGenerator {

    public String name() {
        return "Main Random Number Generator";
    }

    public int generate() {
        final RandomDataGenerator randomDataGenerator = new RandomDataGenerator();
        return randomDataGenerator.nextInt(5, 10);
    }
}


Файлы Субпроекта-1


build.gradle

Empty file

App.java

package org.examples;

import org.apache.commons.math3.random.RandomDataGenerator;

public class App {

    public static void main(String[] args) {
        RandomGenerator aRandomGenerator = new DefaultRandomGenerator();
        System.out.println("The 1st random number is :" + aRandomGenerator.generate());
        System.out.println("The 2nd random number is :" + generateMy());
    }

    public static int generateMy() {
        final RandomDataGenerator aRandomDataGenerator = new RandomDataGenerator();
        return aRandomDataGenerator.nextInt(5, 10);
    }
}

1 ответ

Решение

Как App.java отлично работает без импорта класса DefaultRandomGenerator из SubProject-2

Это работает, потому что они оба находятся в одном пакете (org.examples).

Обратите внимание, что это не сработает при использовании новой модульной системы, представленной в Java 9. Поскольку два проекта считаются "разделенными", вам потребуются различные приемы, чтобы заставить их работать.

Почему я получаю сообщение об ошибке "Не найдено кандидатов для вызова метода api" в файле build.grade родительского проекта (MultiProjectApp).

Это проблема IDE, а не проблема градиента. Если вы запустите, он все равно должен работать.

Пример запуска в Vscode

Другие вопросы по тегам