Как получить доступ к зависимости в Java / Gradle? - PullRequest
3 голосов
/ 13 февраля 2020

Я пытаюсь получить доступ к библиотеке, которая реализована в библиотеке, которую я внедряю. Я владею обеими этими библиотеками. Т.е.:

Lib1 имеет определенный класс, к которому я хочу получить доступ в потребительском приложении, скажем, Car.java:

public class Car {
    public Int wheelsCount;
}

Lib2 имеет API, который возвращает класс Car из lib1:

gradle.build:

...
api 'com.me.lib1:1.0' //From maven central (not currently live)
import com.lib1.Car

interface MyApi {
    public Car getCar();
}

Потребительский gradle.build: implementation 'com.me.lib2:1.0'

MyApi api = getMyApi()
api.getCar() // Error

Невозможно получить доступ к классу 'com.lib1.Car'. Проверьте путь к классам вашего модуля на предмет отсутствующих или конфликтующих зависимостей

Вопрос: Есть ли способ сделать это с помощью gradle?

1 Ответ

0 голосов
/ 13 февраля 2020

Я не уверен, что вы спрашиваете. Вот пример, который, я думаю, должен примерно соответствовать тому, о чем вы говорили?


У нас есть проект 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+, есть некоторые дополнительные шаги, но это будет за пределами объем этого вопроса я думаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...