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

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

Мой вопрос:

  1. Как приложение. 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"
    }
}

enter image description here

Файлы SubProject-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);
    }
}

Файлы SubProject-1

build.gradle

Empty file

Приложение. 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 Ответ

1 голос
/ 26 апреля 2020

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

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

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

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

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

Пример выполнения в Vscode Example with vscode

...