私は私が実装することをライブラリに実装されたライブラリにアクセスしようとしています。私は、これらのライブラリの両方を所有しています。すなわち:
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を行う方法はありますか?
私はあなたが求めているのかわからないです。ここで私は大体あなたが話していた何をすべきだと思う例はありますか?
私たちは、3つのサブプロジェクトとGradleのプロジェクトを持っている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
上の依存関係を: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+モジュールシステムを使用している場合はそこにいくつかの追加の手順がありますが、これは私が考えるこの質問の範囲を超えだろう。