javagradlegradle-plugingradle-multi-project-build

api configuration of java-library plugin is not recognized


I am new to Gradle and i am using Gradle 6.1.
I am writing small application to understand the concepts of multi project Application and Java-Library plugin of Gradle.

My Question is :

  1. How App.java is running perfectly fine without importing DefaultRandomGenerator class from SubProject-2

  2. Why am i getting the error message "No candidates found for method call api" in build.grade file of Parent project (MultiProjectApp).


Below are my application code :


Parent Project (MultiProjectApp) files


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 files


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 files


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);
    }
}

Solution

  • How App.java is running perfectly fine without importing DefaultRandomGenerator class from SubProject-2

    It works because they are both in the same package (org.examples).

    Note that this will not work if using the new module system introduced in Java 9. Because the two projects are considered "split", and you will need various hacks to make it work.

    Why am I getting the error message "No candidates found for method call api" in build.grade file of Parent project (MultiProjectApp).

    This is an IDE problem, not a gradle problem. If you run, it should still work.

    Example of runnig it in Vscode Example with vscode