在android项目中使用maven库

时间:2015-12-13 05:43:21

标签: java android maven

我有一个特定的图书馆项目,可以完成某项工作。该库是使用maven构建的。

我现在想要将这个库包含在android项目中。我在gradle中添加了库jar作为编译依赖项,我可以在我的android代码中成功使用该库。

我安装了JDK 8,并使用它构建库。但是,正如我所读,android使用Java 7.由于库是使用JDK 8构建的,这会导致问题吗?

如果它可能导致问题,我认为使用JDK 7构建库也不会解决它,因为库依赖于来自外部maven存储库的其他maven库。我有什么可以做的吗?

1 个答案:

答案 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>

注意

这有一个缺点,那就是在为编译器设置特定的sourcetarget时,代码仍然可以使用目标环境中不可用的JDK功能& #39; s JRE。例如,将JAVA_HOME设置为JDK8而将sourcetarget设置为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>