将 gradle 从 4.4 更新到 5.4 使 joda-time 依赖问题
update gradle from 4.4 to 5.4 make joda-time dependancy issue
嗨,我已经将项目从 4.4 迁移到 gradle 5.4 版。此后 gradlew build
returns 错误如下。
....ConvTable.java:6: error: package org.joda.time does not exist
import org.joda.time.DateTime;
...ConvetService.java:5: error: package org.joda.time does not exist
import org.joda.time.DateTime;
...ConvetService.java:34: error: cannot find symbol
ConvTableP getLastCononTableDate(String fromCurrency, String toCurrency, DateTime dateTimeZone) throws IOException;
symbol: class DateTime
location: interface ConvetService
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details
* What went wrong:
Execution failed for task ':cur-api:compileJava'
gradle 文件如下所示。它是更大项目的一个子项目
apply plugin: "j-library"
apply plugin: "m-publish"
group = "com.t.cur"
sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_7
publishing { publications { mavenJava(MavenPublication) { } }
repositories {
maven { url "${mv_repo_url}" } }
}
dependencies {
implementation "com.t.com:x-core:1.0.0"
implementation "commons-lang:commons-lang:2.6"
}
我的猜测是,作为升级的一部分,您将 compile
配置更改为 implementation
。与新配置的区别之一是依赖项不会作为编译类路径的一部分暴露给消费项目。这个想法是,您放入 implementation
的依赖项是特定于实现的,不应 "leak" 到消费项目中。当使用增量编译时,这会加快构建速度,因为依赖 类 仅在 public API 更改而不是内部实现时才重新编译。还有一种情况是在项目之间提供更松散的耦合,尽管这有点主观。 implementation
依赖项仍然是 runtimeClasspath
配置的一部分,并已解决。
因此(假设这是根本问题),依赖项 x-core
用于提供 Joda 作为编译的传递依赖项。但现在已经不是这样了。
有两种方法可以修复它。如果您将 Joda 用作 x-core
的 public API 的一部分,则需要使用 api
配置而不是 implementation
来声明它(并使用 java-library
插件,如果你还没有)。这将使 Joda 成为依赖项目的编译类路径的一部分。
另一方面,如果这个子项目恰好也使用了 Joda,但是以与 x-core
完全无关的方式,您也应该在这里将其声明为依赖项(或者 implementation
或 api
使用与之前相同的规则)。
嗨,我已经将项目从 4.4 迁移到 gradle 5.4 版。此后 gradlew build
returns 错误如下。
....ConvTable.java:6: error: package org.joda.time does not exist
import org.joda.time.DateTime;
...ConvetService.java:5: error: package org.joda.time does not exist
import org.joda.time.DateTime;
...ConvetService.java:34: error: cannot find symbol
ConvTableP getLastCononTableDate(String fromCurrency, String toCurrency, DateTime dateTimeZone) throws IOException;
symbol: class DateTime
location: interface ConvetService
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details
* What went wrong:
Execution failed for task ':cur-api:compileJava'
gradle 文件如下所示。它是更大项目的一个子项目
apply plugin: "j-library"
apply plugin: "m-publish"
group = "com.t.cur"
sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_7
publishing { publications { mavenJava(MavenPublication) { } }
repositories {
maven { url "${mv_repo_url}" } }
}
dependencies {
implementation "com.t.com:x-core:1.0.0"
implementation "commons-lang:commons-lang:2.6"
}
我的猜测是,作为升级的一部分,您将 compile
配置更改为 implementation
。与新配置的区别之一是依赖项不会作为编译类路径的一部分暴露给消费项目。这个想法是,您放入 implementation
的依赖项是特定于实现的,不应 "leak" 到消费项目中。当使用增量编译时,这会加快构建速度,因为依赖 类 仅在 public API 更改而不是内部实现时才重新编译。还有一种情况是在项目之间提供更松散的耦合,尽管这有点主观。 implementation
依赖项仍然是 runtimeClasspath
配置的一部分,并已解决。
因此(假设这是根本问题),依赖项 x-core
用于提供 Joda 作为编译的传递依赖项。但现在已经不是这样了。
有两种方法可以修复它。如果您将 Joda 用作 x-core
的 public API 的一部分,则需要使用 api
配置而不是 implementation
来声明它(并使用 java-library
插件,如果你还没有)。这将使 Joda 成为依赖项目的编译类路径的一部分。
另一方面,如果这个子项目恰好也使用了 Joda,但是以与 x-core
完全无关的方式,您也应该在这里将其声明为依赖项(或者 implementation
或 api
使用与之前相同的规则)。