如何将AAR转换为JAR

99

情况:

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

背景故事:

我试图编译一个库,但是它的Gradle结构不稳定。因此,我请求一个已编译的jar文件,它的开发者从某个Maven存储库中交给了我一个aar文件(该开发者无法编译自己的项目)。 Gradle配置是一团糟,它依赖于多个库,Gradle抛出了一些异常。

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

问题:

我应该怎么做才能将那个AAR文件转换为JAR文件?


1
你可以将它重命名为 .jar,但是如果不了解你的环境更多细节,这可能或可能不是你需要做的事情,AAR 是一个具有特定用途的 Axis 库。 - Pedantic
1
你可能会笑,但我不得不添加一些非常规的词语,因为SO不允许我的问题以如此简单的措辞发布。而且我猜,这说明了库的开发者无法使用Gradle编译自己的项目... - Nestor
8个回答

154

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

  1. 使用标准的zip提取工具提取AAR文件(将其重命名为*.zip以使操作更方便)
  2. 在提取的文件中找到classes.jar文件
  3. 将其重命名并在项目中使用该jar文件

59
有趣的是这个答案被接受了,因为仅仅重命名一个jar文件并将其复制到项目的libs目录下不会起作用,因为该jar文件中缺少资源文件。 - ChuongPham
12
我曾花费一些时间在Mac上找到如何提取它,以防其他人也遇到同样的问题:只需将.aar文件的扩展名更改为.zip,然后双击! - Bastien Beurier
5
那么创建基于资源的jar包的解决方案是什么? - 2cupsOfTech
2
这个解决方案只提取了jar文件,但其中不包含资源。可能有问题。 - bitristan
@2cupsOfTech 请查看我关于基于资源的 .aar 文件的答案。 - OneWorld
显示剩余3条评论

22

.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.jarC:\Program Files\Java\jdk1.7.0_25\bin> - Nestor
1
兄弟,第一步就够了。只需将其重命名为 .jar 即可。在我看来,步骤(2)和(3)是无用的。 - Dr Deo
@DrDeo 如果我只是重命名它,Eclipse 项目无法将其识别为库。这正常吗?有什么线索吗? - Tanasis
1
如果你只是重命名它,而不重新打包成jar文件,它将没有清单文件,并且无法识别为有效的jar文件。 - AWT

16

正如其他人指出的那样,仅从 .aar 文件中提取 .jar 文件可能会丢失资源。

以下是对我有效的步骤(在 Android 上下文中,如果您有其他目的,则可能会有所不同):

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

1
这对我有所帮助。但为了使其完全可用,我需要在第6步和第7步之间创建一个空的“src”文件夹。 - Bernhard Krenz
我赞同需要创建一个空的src文件夹。此外,一旦这个过程能够正常工作(因为步骤非常清晰),我必须删除proguard.cfg的引用:https://dev59.com/Jmox5IYBdhLWcg3w95A9#74728030 + 从应用程序的libs文件夹中删除旧的android-support-v4.jar。 - WebViewer

8

对于那些想要自动完成此操作的人,我编写了一个只有两行的bash脚本,它可以完成以下两个任务:

  1. Looks for all *.aar files and extracts classes.jar from them
  2. Renames extracted classes.jar to be like the aar but with a new extension

    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`' \;
    

就是这样!


1
当进行aar2jar转换时,不会包含资源和清单。我们可以说(不是绝对的,但接近)aar=jar+res+manifest+libs。让rest=res+manifest+libs,那么jar(aar)=aar-rest - ddmytrenko
这正是我想要的!非常感谢。但这会真正增加磁盘使用量,因为每个支持库都有许多版本。仅解压最新版本可能会更好。 - iptton

6
Android Studio(版本:1.3.2)允许您无缝访问.aar文件中的.jar文件。额外福利:它会自动反编译类!只需按照以下步骤操作:1.选择“文件 > 新建 > 新建模块 > 导入.JAR/.AAR包”将.aar作为模块导入;2.将新创建的模块添加为主项目的依赖项(不确定是否需要);3.右键单击下面所示的"classes.jar",然后单击"在资源管理器中显示"。这就是您的.jar文件。

access .jar from .aar


1
首先在项目管理器中选择项目而不是Android,然后外部库将显示。 - Samad

6

基于资源的.aar项目

找到.aar文件中的classes.jar文件非常容易。然而,如果.aar项目定义了一些资源(例如:R.layout.xyz),这种方法就不起作用了。

  • 因此,CommonsGuy的deaar帮助我从一个.aar文件中获得了一个有效的ADT友好的项目。在我的情况下,我转换了subsampling-scale-image-view,我花了大约一个小时在我的电脑上设置ruby。

  • 另一种方法是使用Eclipse/ADT的android-maven-plugin,正如CommonsGuy在他的博客中所写的那样

  • 还有另一种方法,就是从git中克隆整个所需的项目作为源代码,并将其导入为“现有的Android项目”。


第三种方法和 https://dev59.com/2mEi5IYBdhLWcg3wRauf#37747277 是一样的吗? - WebViewer

5
 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文件,请使用上述方法。 假设您想要将manifest.xml和资源包含在您的.jar文件中,那么您可以直接右键单击您的.aar文件并将其保存为.jar文件,而不是保存为.zip文件。要查看您提取的.jar文件,请下载JD-GUI(Java反编译器)。然后将您的.jar文件拖放到此JD_GUI中,您可以看到可读格式的.class文件,就像一个.java文件一样。

enter image description here enter image description here


这是否意味着我们可以通过将扩展名从.aar改为.jar来像使用JAR文件一样使用AAR文件? - Soumya
@Soumya,不可以。 - ddmytrenko
2
实际上,对话的主题是错误的。我们不能将AAR转换为JAR或反之亦然。我们唯一能做的就是“从AAR中提取JAR”。我已经在这里写了如何使用两行Bash代码自动执行此操作:https://dev59.com/2mEi5IYBdhLWcg3wRauf#29252592 - ddmytrenko

1
如果您正在使用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应用/库插件制作“compileOnlyAar”?我知道这与您的库无关,但也许您知道是否可能,因为Android插件不包含像“compileOnlyAar”这样的构件配置。您可以在此处了解为什么我需要此功能(https://stackoverflow.com/questions/60998072/how-to-make-an-equivalent-of-compileonly-for-aar-artifacts)。 - HeyAlex
你的引号有问题,而且我无法编辑,因为编辑队列已满。 - Nailuj29

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接