我正在尝试访问在我实现的库中实现的库。我拥有这两个库。即:
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做到这一点?
答案 0 :(得分:0)
我不确定您要问什么。这是一个示例,我认为您应该大致按照您所说的做?
我们有一个gradle项目,其中包含3个子项目car
,garage
和app
。 car
和garage
提供了库,而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();
}
garage
是car
项目的使用者,并提供了一种获取新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+模块系统,则还有一些其他步骤,但这超出了我认为的范围。