如何在Java / Gradle中访问依赖关系的依赖关系?

时间:2020-02-13 17:28:29

标签: java gradle kotlin

我正在尝试访问在我实现的库中实现的库。我拥有这两个库。即:

Lib1 具有我要在消费者应用中访问的特定类,例如Car.java

public class Car {
    public Int wheelsCount;
}

Lib2 有一个api,可从lib1返回类Car

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 :(得分:0)

我不确定您要问什么。这是一个示例,我认为您应该大致按照您所说的做?


我们有一个gradle项目,其中包含3个子项目cargarageappcargarage提供了库,而app是我们的应用程序。除了这些目录之外,根目录仅包含具有以下内容的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();
}

garagecar项目的使用者,并提供了一种获取新Car的方法。因此,我们需要像这样声明对api的{​​{1}}依赖项:

: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

因此,正如您所看到的,除了已经说明的事情之外,您不需要做任何其他特别的事情。假设您正在使用类路径。如果您使用的是Java 9+模块系统,则还有一些其他步骤,但这超出了我认为的范围。