我有一个特定的图书馆项目,可以完成某项工作。该库是使用maven构建的。
我现在想要将这个库包含在android项目中。我在gradle中添加了库jar作为编译依赖项,我可以在我的android代码中成功使用该库。
我安装了JDK 8,并使用它构建库。但是,正如我所读,android使用Java 7.由于库是使用JDK 8构建的,这会导致问题吗?
如果它可能导致问题,我认为使用JDK 7构建库也不会解决它,因为库依赖于来自外部maven存储库的其他maven库。我有什么可以做的吗?
答案 0 :(得分:2)
这是一个常见的JDK生命周期问题。好消息是,您可以采取一些措施来确保构建中的所有内容都符合某个JDK。
首先,请确保您的模块确实使用您愿意接受的最新JDK版本进行编译。您可以将编译器插件设置为仅生成符合特定版本的字节码,例如JDK 7.
例如:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>THE_JDK_VERSION_YOU_WANT</source>
<target>THE_JDK_VERSION_YOU_WANT</target>
</configuration>
</plugin>
</plugins>
</build>
注意强>
这有一个缺点,那就是在为编译器设置特定的source
和target
时,代码仍然可以使用目标环境中不可用的JDK功能& #39; s JRE。例如,将JAVA_HOME
设置为JDK8而将source
和target
设置为1.7仍然允许代码使用(例如)JDK8中的ConcurrentHashMap.mappingCount()
。
此问题的答案是使用animal-sniffer
插件。如果您以这种方式配置,此插件将检查您的代码是否使用了不允许的API:s,例如JDK8。这个插件以前是由Codehaus托管的,但如果谷歌有点出现,它会出现。我明天回去工作时可以为你提供一个工作实例。
接下来,正如您所指出的,您有自己的依赖关系。幸运的是,enforcer
插件可以使用名为<enforceBytecodeVersion>
的扩展规则集,它可以检查所有依赖项是否也符合特定的字节码版本。所有详细信息均可供here。
<强> EDITED 强>
这是animal-sniffer
插件的配置。有一个更新的版本(1.14),但它对我没有用。也许你会有更好的运气。 JDK的API签名可在Maven Central获得。
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>animal-sniffer-maven-plugin</artifactId>
<version>1.13</version>
<executions>
<execution>
<id>check-for-jdk6-compliance</id>
<phase>test</phase>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
<configuration>
<signature>
<groupId>org.codehaus.mojo.signature</groupId>
<artifactId>java16</artifactId>
<version>1.1</version>
</signature>
</configuration>
</plugin>