不暴露我依赖的jar文件
Not to expose the jar file that I depend on
我有一个依赖于某个 lib.jar
的 AAR 库。我通过以下方式将其添加到我的 AAR 中:
dependencies {
implementation files('myexternallibs/lib.jar')
...
}
在生成的 AAR 中,我仍然可以访问 lib.jar
中的 类。根据 SO 中的许多答案,关键字 implementation
应该可以防止这种情况发生。我错过了什么吗?
实现将阻止访问由 lib.jar
实现的库,而不是这个库
例如:
Library1
|-> Class1
|-> Class2
Library2 (implementation 'Library1')
|-> Class3 (this library can access Class1 and Class2)
YourProject (implementation 'Library2')
|-> Main (this library can access Class3, but not Class1 and Class2)
应使用普通 implementation
,以及正确编写和构建的库。
简单地将 .jar
代码添加为 Java 模块可能是最简单的 -
为了完全控制哪些方法可以访问。
你定义了api吗?
请参阅 gradle 站点中的示例:https://docs.gradle.org/current/userguide/java_library_plugin.html#sec:java_library_separation
dependencies {
api 'commons-httpclient:commons-httpclient:3.1'
implementation 'org.apache.commons:commons-lang3:3.5'
}
我把implementation
改成了compileOnly
。成功了。
来自documentation的注释:
If you use this configuration, then your library module must include a
runtime condition to check whether the dependency is available, and
then gracefully change its behavior so it can still function if it's
not provided.
为此,您需要像这样检查类路径:
try {
Class.forName("com.company.ClassName");
}
catch (ClassNotFoundException ex) {
// class is not available
}
我有一个依赖于某个 lib.jar
的 AAR 库。我通过以下方式将其添加到我的 AAR 中:
dependencies {
implementation files('myexternallibs/lib.jar')
...
}
在生成的 AAR 中,我仍然可以访问 lib.jar
中的 类。根据 SO 中的许多答案,关键字 implementation
应该可以防止这种情况发生。我错过了什么吗?
实现将阻止访问由 lib.jar
实现的库,而不是这个库
例如:
Library1
|-> Class1
|-> Class2
Library2 (implementation 'Library1')
|-> Class3 (this library can access Class1 and Class2)
YourProject (implementation 'Library2')
|-> Main (this library can access Class3, but not Class1 and Class2)
应使用普通 implementation
,以及正确编写和构建的库。
简单地将 .jar
代码添加为 Java 模块可能是最简单的 -
为了完全控制哪些方法可以访问。
你定义了api吗?
请参阅 gradle 站点中的示例:https://docs.gradle.org/current/userguide/java_library_plugin.html#sec:java_library_separation
dependencies {
api 'commons-httpclient:commons-httpclient:3.1'
implementation 'org.apache.commons:commons-lang3:3.5'
}
我把implementation
改成了compileOnly
。成功了。
来自documentation的注释:
If you use this configuration, then your library module must include a runtime condition to check whether the dependency is available, and then gracefully change its behavior so it can still function if it's not provided.
为此,您需要像这样检查类路径:
try {
Class.forName("com.company.ClassName");
}
catch (ClassNotFoundException ex) {
// class is not available
}