繁体   English   中英

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

[英]How to access a dependency of a dependency in Java/Gradle?

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

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 做到这一点?

我不确定你在问什么。 这是一个我认为应该大致做你所说的例子?


我们有一个包含 3 个子项目的 gradle 项目, cargarageapp cargarage提供库,而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的方法。 所以我们需要像这样声明一个:carapi依赖:

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

最后,我们有我们的应用程序,它只需要一个对garageimplementation依赖来使用它和一个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整个gradle :app:run ,它应该给我们以下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+ 模块系统,还有一些额外的步骤,但这超出了我认为的这个问题的范围。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM