如何将 AAR 转换为 JAR

Posted

技术标签:

【中文标题】如何将 AAR 转换为 JAR【英文标题】:How to convert AAR to JAR 【发布时间】:2014-02-20 10:47:25 【问题描述】:

情况

我打算使用 Java 库,我只有一个来自 Maven 存储库的 AAR 文件,但我需要 JAR 文件。

背景故事:

我试图编译一个库,但它的 Gradle 结构不稳定。所以我要求一个已编译的 jar 文件,它的开发人员从某个 Maven 存储库中递给我一个 aar 文件(开发人员无法编译他自己的项目)。 Gradle 配置一团糟,它依赖于多个库,并且 Gradle 抛出了一些异常。

我尝试在我的 IDEA IDE 中使用它,但它看不到它。一个库项目应该可以编译成jar文件吧?

问题

我应该如何将该 AAR 文件转换为 JAR 文件?

【问题讨论】:

您可以将其重命名为 .jar 但不了解有关您的环境的更多详细信息,这可能是也可能不是您需要做的,AAR 是一个具有特定用途的 Axis 库。 你会笑的,但我不得不添加一些非常规的词,因为 SO 不会让我的问题被发布,因为它的措辞非常简单。而且我想,它告诉了库的开发人员无法使用 Gradle 编译他自己的项目的一切...... 【参考方案1】:

AAR 文件由 JAR 文件和一些资源文件组成(它基本上是一个标准的 zip具有自定义文件扩展名的文件)。以下是转换的步骤:

    使用标准 zip 解压器解压 AAR 文件(将其重命名为 *.zip 以使其更容易) 在解压文件中找到classes.jar文件 根据需要重命名并在项目中使用该 jar 文件

【讨论】:

有趣的是,这个答案被接受了,因为简单地重命名一个 jar 并将其复制到项目的 libs 目录中是行不通的,因为 jar 中缺少资源文件。 按照 Spotify android SDK 的教程,这个答案是补救措施。这是因为我在 Netbeans 中开发项目,这似乎不符合 AAR 扩展。 ChuongPham 的评论似乎与这个答案无关,而是与 AWT 的答案有关,然后我部分同意 ChuongPham,即从 AAR 简单重命名为 JAR 是行不通的。但是,我也部分不同意,因为“资源”与 classes.jar 文件无关。 我很难找到如何在 mac 上提取它,以防其他人也一样:只需将 .aar 更改为 .zip 并双击! 那么创建基于资源的 jar 的解决方案是什么? 这个解决方案只提取jar文件,但其中不包含资源。出了点问题。【参考方案2】:

.aar 是一个标准的 zip 归档文件,与 .jar 中使用的相同。只需更改扩展名,假设它没有损坏或其他任何东西,它应该没问题。

如果需要,可以将其解压缩到文件系统,然后将其重新打包为 jar。

1) Rename it to .jar
2) Extract: jar xf filename.jar
3) Repackage: jar cf output.jar input-file(s)

【讨论】:

当我运行 jar xf 时,我什么也得不到:C:\Program Files\Java\jdk1.7.0_25\bin>jar xf c:\dev\1\android-maps-utils- 0.2 .1.jar C:\Program Files\Java\jdk1.7.0_25\bin> 老兄,第一步就够了。只需将其重命名为 .jar 。在我看来,步骤(2)和(3)没用 @DrDeo 如果我只是重命名它,Eclipse 项目不会将其识别为库。正常吗?有什么线索吗? 如果你只是重命名它而不用 jar 重新打包它,我相信它不会有清单并且它不会将它识别为有效的 jar 文件。【参考方案3】:

正如许多其他人指出的那样,仅从 .aar 文件中提取 .jar 并不能完全消除它,因为资源可能会丢失。

以下是对我有用的步骤(Android 环境,如果您有其他目的,您的里程可能会有所不同):

    将 .aar 文件重命名为 .zip 并解压。 提取的文件夹是一个 ADT 项目,您可以在 Eclipse 中进行一些小的修改(见下文)将其导入! 在提取的文件夹中,将包含的文件 classes.jar 重命名为您喜欢的任何文件(在本例中为 myProjectLib.jar),并将其移动到提取文件夹中的 lib 文件夹中。 现在为了让 Eclipse 接受它,您需要将两个文件放入提取的文件夹根目录中: .project .classpath 为此,请在 Eclipse 中创建一个新的 Android 虚拟项目并复制文件,或从现有的 Android 项目复制。 打开 .project 文件并查找 XML 名称标签并将其内容替换为 myProjectLib(或您在上面调用的任何 jar 文件)并保存。 现在在 Eclipse 中,您可以File -> New -> Project -> Android Project from existing source.. 并指向提取的文件夹内容。 导入后右键新建项目,选择Properties -> Android,勾选Is Library。 在您要使用该库的主项目中,还可以转到 Properties -> Android 并将新添加的 myProjectLib 添加到依赖项列表中。

【讨论】:

这对我有帮助。但为了完全正常工作,我需要在第 6 步和第 7 步之间创建一个空的“src”文件夹。【参考方案4】:

对于那些想要自动执行此操作的人,我编写了一个两行的 bash 脚本来完成接下来的两件事:

    查找所有 *.aar 文件并从中提取 classes.jar

    将提取的 classes.jar 重命名为类似于 aar 但具有新扩展名

    find . -name '*.aar' -exec sh -c 'unzip -d `dirname `  classes.jar' \;
    find . -name '*.aar' -exec sh -c 'mv `dirname `/classes.jar `echo  | sed s/aar/jar/g`' \;
    

就是这样!

【讨论】:

当然,任何 aar2jar 转换都不会包含资源和清单。我们可以说(不是绝对但接近)aar=jar+res+manifest+libs。让rest=res+manifest+libs,而不是jar(aar)=aar-rest 这就是我真正想要的!非常感谢。但它确实增加了磁盘使用率。因为每个支持库都有很多版本。只解压最新版本可能会更好【参考方案5】:

Android Studio(版本:1.3.2)允许您无缝访问 .aar 中的 .jar。

奖励:它会自动反编译类!

只需按照以下步骤操作:

    File > New > New Module > Import .JAR/.AAR Package 将您的 .aar 作为模块导入

    将新创建的模块作为依赖项添加到您的主项目(不确定是否需要)

    如下图所示,右键单击“classes.jar”,然后单击“在资源管理器中显示”。这是你的 .jar。

【讨论】:

首先必须在项目管理器中选择项目而不是android,然后会显示外部库【参考方案6】:
 The 'aar' bundle is the binary distribution of an Android Library Project. .aar file 
 consists a JAR file and some resource files. You can convert it
 as .jar file using this steps

1) Copy the .aar file in a separate folder and Rename the .aar file to .zip file using 
 any winrar or zip Extractor software.

2) Now you will get a .zip file. Right click on the .zip file and select "Extract files". 
 Will get a folder which contains "classes.jar, resource, manifest, R.java,
 proguard(optional), libs(optional), assets(optional)".

3) Rename the classes.jar file as yourjarfilename.jar and use this in your project.

注意:如果您只想从 .aar 文件中获取 .jar 文件,请使用 以上方式。 假设如果你想在你的 .jar 文件中包含 manifest.xml 和资源意味着 您只需右键单击您的 .aar 文件并将其直接保存为 .jar 文件,而不是 将其保存为 .zip。要查看您提取的 .jar 文件,请下载 JD-GUI(Java Decompiler)。然后将 .jar 文件拖放到这个 JD_GUI 中,您可以看到 .class 文件的可读格式,如 .java 文件。

【讨论】:

这是否意味着我们可以像使用 JAR 文件一样使用 AAR 文件,只需将其从 .aar 重命名为 .jar 即可? @Soumya,不,你不能。 其实谈话的主题是错误的。我们不能将 AAR 转换为 JAR,反之亦然。我们唯一能做的就是“从 AAR 中提取 JAR”。我已经在这里使用两行 Bash 代码编写了如何自动执行此操作:***.com/a/29252592/746529【参考方案7】:

基于资源的 .aar-projects

在 .aar 文件中查找 classes.jar 文件非常简单。但是,如果 .aar-project 定义了一些资源(例如:R.layout.xyz),则该方法不起作用

因此,来自 CommonsGuy 的 deaar 帮助我获得了有效的 来自 .aar 文件的 ADT 友好项目。 就我而言,我转换了 subsampling-scale-image-view。我花了大约一个小时在我的电脑上设置 ruby​​。

另一种方法是使用 android-maven-plugin for Eclipse/ADT as CommonsGuy writes in his blog。

另一种方法可能是克隆整个所需项目 作为 git 的源并将其导入为“现有 Android 项目”

【讨论】:

【参考方案8】:

如果您使用 Gradle 进行构建 - 有一个 Gradle 插件允许您将 aar 依赖项添加到您的 java|kotlin|scala|... 模块。

https://github.com/stepango/aar2jar

plugins 
    id 'java'
    id 'com.stepango.aar2jar' version “0.6” // <- this one


dependencies 
    compileOnlyAar "com.android.support:support-annotations:28.0.0" // <- Use any AAR dependencies

【讨论】:

试图理解,是否可以为 android app/lib 插件制作“compileOnlyAar”?我知道这与您的库无关,但也许您知道有可能,因为 android 插件不包含像“compileOnlyAar”这样的工件配置。你可以在这里理解我为什么需要这个功能 (***.com/questions/60998072/…) 您的报价已损坏,我无法编辑,因为编辑队列已满

以上是关于如何将 AAR 转换为 JAR的主要内容,如果未能解决你的问题,请参考以下文章

修改 Android .aar 文件的内容 / 与 .zip 格式相互转换

如何将 JAR 依赖项包含到 AAR 库中

如何将java文件转换为jar包

Android如何将一个Demo或者app打包成aar或jar提供给其他应用使用

Android Studio中打包aar并引用及打jar包

Android Studio中打包aar并引用及打jar包