Я не уверен, что вы спрашиваете. Вот пример, который, я думаю, должен примерно соответствовать тому, о чем вы говорили?
У нас есть проект gradle с 3 подпроектами, car
, garage
и app
. car
и garage
предоставляют библиотеки, тогда как app
является нашим приложением. Помимо этих каталогов, каталог root содержит только settings.gradle
с таким содержимым:
rootProject.name = 'example'
include 'car', 'garage', 'app'
Продолжаем, у нас есть проект car
, который предоставляет интерфейс. Это build.gradle
выглядит так:
plugins {
id 'java-library'
}
Кроме этого, он содержит только наш интерфейс на src/main/java/car/Car.java
:
package car;
public interface Car {
void drive();
}
garage
является потребителем для проект car
и предоставляет возможность получить новые Car
s. Поэтому нам нужно объявить api
зависимость от :car
следующим образом:
plugins {
id 'java-library'
}
dependencies {
api project(':car')
}
Сам класс Garage
выглядит следующим образом (под src/main/java/garage/Garage.java
:
package garage;
import car.Car;
public class Garage {
public Car getCar() {
return () -> { System.out.println("Hello World!"); };
}
}
Наконец, у нас есть наше приложение, которому просто необходима зависимость implementation
от garage
для его использования и задача JavaExec
для его запуска:
plugins {
id 'java'
}
dependencies {
implementation project(':garage')
}
task run(type: JavaExec) {
main = 'app.Main'
classpath = sourceSets.main.runtimeClasspath
}
Фактическая реализация снова переходит к src/main/java/app/Main.java
:
package app;
import garage.Garage;
public class Main {
public static void main(String[] args) {
Garage g = new Garage();
g.getCar().drive();
}
}
Теперь мы можем запустить все это с помощью gradle :app:run
, что должно дать нам вывод в следующем виде:
> Task :app:run
Hello World!
BUILD SUCCESSFUL in 506ms
6 actionable tasks: 1 executed, 5 up-to-date
<-------------> 0% WAITING
> IDLE
Итак, как вы можете видеть нет ничего особенного, что вам нужно сделать, помимо того, что вы уже заявили. Это предполагает, что вы используете пути к классам. Если вы используете систему модулей Java 9+, есть некоторые дополнительные шаги, но это будет за пределами объем этого вопроса я думаю.