Gradle: qual é a diferença entre as dependências de classpath e compilar


95

Ao adicionar dependências ao meu projeto, nunca tenho certeza de qual prefixo devo dar a elas, por exemplo, "classpath"ou"compile".

Por exemplo, minhas dependências abaixo devem ser o tempo de compilação ou o classpath?

Além disso, isso deve estar em meus aplicativos build.gradle ou no build.gradle específico do módulo ?

Build.gradle atual (no nível do aplicativo):

apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.hibernate:hibernate-core:5.0.5.Final'
    compile 'mysql:mysql-connector-java:5.1.38'
} 

1
Eu não tenho certeza se entendi. classpathnão é um escopo de dependência válido.
Tunaki

Talvez eu esteja ficando confuso, quais são os escopos de dependência válidos?
java123999

Dê uma olhada neste documento: docs.gradle.org/current/userguide/…
Tunaki

Uma coisa que notei é que as compileOnlydependências vão para, project.configurations.compileClasspathmas não vão project.configurations.compile, conforme mencionado aqui github.com/iboyko/gradle-plugins/issues/5
Vytenis Bivainis

Respostas:


48

Vou supor que você está fazendo referência compilee classpathdentro do dependencies {}bloco. Se for assim, essas são configurações de dependência .

Uma configuração é simplesmente um conjunto nomeado de dependências.

A compileconfiguração é criada pelo plugin Java. A classpathconfiguração é comumente vista no buildSrc {}bloco onde é preciso declarar dependências para o próprio build.gradle (para plug-ins, talvez).


Obrigado, então para o meu build.gradle principal, não devo precisar usar o classpath?
java123999

@ java123999 Não, a menos que você use plug-ins personalizados
Eric Wendelin

@EricWendelin Onde você diz "dentro do bloco de {} dependências", você quer dizer "dentro do bloco de {dependências {}} de buildscript"? (Não tenho certeza, só estou perguntando.)
Paulo Merson

2
Um dependencies {}bloco pode ser declarado dentro buildscript {}e fora dele. Quando dentro, você usa a classpathconfiguração de dependências necessárias para compilar o próprio script de construção.
Eric Wendelin,

56

Se o próprio buildscript precisar de algo para ser executado, use o classpath .

Se o seu projeto precisa de algo para ser executado, use compilar .

O buildscript{}bloco é para o próprio build.gradle.

Para a construção de vários projetos, o arquivo de construção de nível superior é para o projeto raiz, o arquivo de construção específico é para o subprojeto (módulo).

Arquivo de construção de nível superior onde você pode adicionar opções de configuração comuns a todos os subprojetos / módulos.

Não coloque as dependências de seu aplicativo no arquivo de construção de nível superior, elas pertencem aos arquivos individuais do módulo build.gradle


Para confirmar: isso significa que proandroiddev.com/… deve usar um compilee não um classpath?
WillC

1
Mas por que não colocar as dependências do aplicativo no próprio arquivo de nível superior se o projeto tem apenas um módulo, como os aplicativos Android típicos?
Harsha

18

Se bem entendi, você está confundindo Project.dependenciesbloco de script com o Project.buildscript.dependenciesbloco de script (assim como fiz quando cheguei a esta questão).

Vou tentar responder com o que descobri.

Acho que você já deve estar familiarizado com o Project.dependenciesbloco de script. Neste bloco, declaramos dependências que são exigidas por nosso código-fonte. Existem várias maneiras de declarar uma dependência necessária para o projeto. Consulte o Tutorial do Gradle: tipos de dependência . Mencionarei apenas a parte mais relevante para este problema:

compile 'org.hibernate:hibernate-core:5.0.5.Final'é uma declaração de dependência do módulo. A configuração de compilação (que agora está obsoleta pela configuração de implementação.) É meramente uma palavra-chave para Implementation only dependencies.Não é uma palavra-chave que descreve qual tipo de dependência é (por tipo aqui estou seguindo os três tipos definidos no tutorial, ou seja, módulo, arquivo e projeto.)

No Tutorial do Gradle: Organizando a lógica de compilação , diz:

Se seu script de construção precisa usar bibliotecas externas, você pode adicioná-las ao classpath do script no próprio script de construção. Você faz isso usando o método buildscript (), passando um encerramento que declara o classpath do script de construção.

Esta é a mesma maneira que você declara, por exemplo, o classpath de compilação Java. Você pode usar qualquer um dos tipos de dependência descritos em Tipos de dependência, exceto dependências de projeto.

Tendo declarado o caminho de classe do script de construção, você pode usar as classes em seu script de construção como faria com qualquer outra classe no caminho de classe.

Espero que as coisas estejam ficando claras para você agora.

Com classpath "com.android.tools.build:gradle:${Versions.android_gradle_plugin}"estamos definindo o classpathmétodo com o com.android.tools.build:gradle:${Versions.android_gradle_plugin}qual é uma dependência de módulo que é usada pelo próprio script de construção, em vez da fonte em seu projeto.

Por outro lado, compile 'org.hibernate:hibernate-core:5.0.5.Final'estamos declarando uma dependência de módulo necessária para seu projeto com a configuração de compilação .

tl; dr: A classpath, compile, e implementationsão todas as palavras-chave que podem ser utilizados contra as dependências sob diferentes circunstâncias. O primeiro é usado quando você deseja passar uma dependência para o script de construção, e o último é uma das configurações que você deseja declarar.


1
Boa resposta. Devo acrescentar que não apenas devemos olhar para as próprias palavras-chave como o que está bem explicado acima, mas também devemos levar em consideração o artefato que está sendo solicitado porque as palavras-chave sozinhas não definem o contexto completo. Por exemplo, 'org.projectlombok:lombok:1.18.4'não tem classpathassociação porque é um jar que só é necessário durante o javactempo de compilação, mas não é necessário no javatempo de execução. Portanto, o uso correto é uma interação das palavras-chave definidas e do artefato. Isso significa que é necessário um conhecimento a priori.
eigenfield
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.