Como acessar uma dependência de uma dependência em Java / Gradle?

John Sardinha :

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 Carde 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?

Cubic:

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, garagee app. care garagefornecer bibliotecas, ao passo que appé a nossa aplicação. Afora esses diretórios, o diretório raiz contém apenas uma settings.gradlecom esse conteúdo:

rootProject.name = 'example'
include 'car', 'garage', 'app'

Seguindo em frente, nós temos o carprojeto que fornece uma interface. É build.gradleesta 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 carprojeto, e fornece uma maneira de obter novo Cars. Então, precisamos declarar uma apidependência :carcomo esta:

plugins {
  id 'java-library'
}

dependencies {
  api project(':car')
}

A Garageclasse 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 implementationdependência de garageusá-lo e uma JavaExectarefa 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.

Acho que você gosta

Origin http://10.200.1.11:23101/article/api/json?id=477308&siteId=1
Recomendado
Clasificación