Estou tentando acessar uma biblioteca que é implementado em uma biblioteca que eu implementar. Eu próprio tanto essas bibliotecas. ou seja:
Lib1 tem uma certa classe I deseja acessar no aplicativo do consumidor, dizem Car.java
:
public class Car {
public Int wheelsCount;
}
Lib2 tem uma API que retorna a classe Car
de lib1:
gradle.build:
...
api 'com.me.lib1:1.0' //From maven central (not currently live)
import com.lib1.Car
interface MyApi {
public Car getCar();
}
Do consumidor gradle.build:implementation 'com.me.lib2:1.0'
MyApi api = getMyApi()
api.getCar() // Error
não pode classe de acesso 'com.lib1.Car'. Verifique se o seu módulo de classpath para faltando ou conflitantes dependências
Pergunta: Existe uma maneira de fazer isso usando Gradle?
Não estou certo de que você está pedindo. Aqui está um exemplo que eu acho que deve cerca de fazer o que você estava falando?
Temos um projeto Gradle com 3 subprojetos, car
, garage
e app
. car
e garage
fornecer bibliotecas, ao passo que app
é a nossa aplicação. Afora esses diretórios, o diretório raiz contém apenas uma settings.gradle
com esse conteúdo:
rootProject.name = 'example'
include 'car', 'garage', 'app'
Seguindo em frente, nós temos o car
projeto que fornece uma interface. É build.gradle
esta aparência:
plugins {
id 'java-library'
}
Fora isso, ele contém apenas interface em src/main/java/car/Car.java
:
package car;
public interface Car {
void drive();
}
garage
é um consumidor para o car
projeto, e fornece uma maneira de obter novo Car
s. Então, precisamos declarar uma api
dependência :car
como esta:
plugins {
id 'java-library'
}
dependencies {
api project(':car')
}
A Garage
classe em si parece com isso (sob src/main/java/garage/Garage.java
:
package garage;
import car.Car;
public class Garage {
public Car getCar() {
return () -> { System.out.println("Hello World!"); };
}
}
Finalmente, temos a nossa aplicação que só precisa de uma implementation
dependência de garage
usá-lo e uma JavaExec
tarefa para executá-lo:
plugins {
id 'java'
}
dependencies {
implementation project(':garage')
}
task run(type: JavaExec) {
main = 'app.Main'
classpath = sourceSets.main.runtimeClasspath
}
A implementação real novamente vai para 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();
}
}
Agora podemos executar a coisa toda com gradle :app:run
, o que deve nos dar saída ao longo destas linhas:
> Task :app:run
Hello World!
BUILD SUCCESSFUL in 506ms
6 actionable tasks: 1 executed, 5 up-to-date
<-------------> 0% WAITING
> IDLE
Então, como você pode ver, não há nada especial que você precisa fazer para além das coisas que você já estabelecidos. Isso supõe que você está usando classpaths. Se você estiver usando o 9+ sistema de módulos Java, existem alguns passos adicionais, mas isso seria para além do âmbito desta questão, eu acho.