如何将AAR转换为JAR


92

情况

我打算使用Java库,并且只有Maven存储库中的AAR文件,但我需要JAR文件。

背景故事:

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

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

问题

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


1
您可以将其重命名为.jar,但可能不知道是否需要了解有关环境的更多详细信息,因此AAR是具有特定用途的Axis库。
Pedantic 2014年

1
您可能会笑,但是我不得不添加一些不规则的词,因为这样的话措辞太简单,所以我不允许发布我的问题。而且我想,这说明了图书馆的开发人员无法使用Gradle编译自己的项目……
Nestor

Answers:


141

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

  1. 使用标准的zip提取程序提取AAR文件(将其重命名为* .zip使其更容易)
  2. 在解压缩的文件中找到classes.jar文件
  3. 根据需要将其重命名,然后在项目中使用该jar文件

53
有趣的是,这个答案是可以接受的,因为简单地重命名jar并将其复制到项目的libs目录将无法工作,原因是jar中缺少资源文件。
ChuongPham

遵循Spotify Android SDK教程之后,此答案就是解决办法。这是因为我在Netbeans中开发项目,该项目似乎不符合AAR扩展。ChuongPham的话似乎与这个答案无关,而与AWT的答案有关,然后我部分同意ChuongPham的观点,即从AAR到JAR的简单重命名是行不通的。但是,我也部分不同意,因为“资源”与classes.jar文件无关。
卡尔,2015年

11
我很难找出如何在Mac上解压缩它,以防其他情况也是如此:只需将.aar更改为.zip并双击!
Bastien Beurier

5
那么创建基于资源的jar的解决方案是什么?
2cupsOfTech

2
此解决方案仅提取jar文件,但其中不包含资源。会有问题。
Tinker Sun

21

.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>
Nestor

1
花花公子,第1步就足够了。只需将其重命名为.jar即可。我认为步骤(2)和(3)是无用
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接受它,您需要将两个文件放入提取的文件夹根目录中:
    • 。项目
    • .classpath
  5. 为此,请在Eclipse中创建一个新的Android虚拟项目并复制文件,或从现有的Android项目复制。
  6. 打开.project文件,查找XML名称标记,然后将其内容替换为myProjectLib(或上面称为jar的文件)并保存。
  7. 现在在Eclipse中,您可以从现有源文件->新建->项目-> Android项目..并指向提取的文件夹内容。
  8. 导入后,右键单击新创建的项目,选择“ 属性”->“ Android”,然后选中“ 是库”
  9. 在要使用该库的主项目中,也转到“ 属性”->“ Android”,然后将新添加的myProjectLib添加到依赖项列表中。

这对我有帮助。但为了获得充分,如果工作,我需要的步骤6和7之间创建一个空的“SRC”文件夹
伯恩哈德·克伦茨

8

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

  1. 查找所有* .aar文件并从中提取classes.jar
  2. 重命名提取的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`' \;
    

而已!


1
当然,任何aar2jar转换都不会包含任何资源并在其中进行清单。我们可以说(不是肯定但接近)aar=jar+res+manifest+libs。让rest=res+manifest+libs,比jar(aar)=aar-rest
ddmytrenko 2015年

那就是我真正想要的!非常感谢。但这确实增加了磁盘使用率。因为每个支持库都有很多版本。仅解压缩最新版本可能更好
iptton

6

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

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

只需遵循以下步骤:

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

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

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

从.aar访问.jar


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

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文件,请使用上述方法。假设如果要在.jar文件中包含manifest.xml和资源,则意味着可以右键单击.aar文件并将其直接保存为.jar文件,而不是将其保存为.zip。要查看已解压缩的.jar文件,请下载JD-GUI(Java Decompiler)。然后将您的.jar文件拖放到此JD_GUI中,您可以看到具有可读格式的.class文件,例如.java文件。

在此处输入图片说明 在此处输入图片说明


这是否意味着我们可以将AAR文件从.aar重命名为.jar来将其用作JAR文件?
Soumya 2015年

@Soumya,不,你不能。
ddmytrenko

2
对话的话题实际上是错误的。我们不能将AAR转换为JAR,反之亦然。我们唯一能做的就是“从AAR中提取JAR”。而且我在这里写下了如何使用两行Bash代码自动执行此操作:stackoverflow.com/a/29252592/746529
ddmytrenko

4

基于资源的.aar-projects

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

  • 因此,CommonsGuy的deaar帮助我从.aar文件中获取了一个有效的ADT友好项目。就我而言,我转换了 subsampling-scale-image-view。我花了大约一个小时才在我的PC上设置红宝石。

  • 另一种方法是使用CommonsGuy在博客中写道的 android-maven-plugin用于Eclipse / ADT 。

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


1

如果您在构建中使用Gradle-有一个Gradle插件,可让您向java | kotlin | scala | ...模块添加aar依赖项。

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应用程序/ lib插件制作“ compileOnlyAar”?我知道这与您的库无关,但也许您知道是否有可能,因为android插件不包含“ compileOnlyAar”之类的工件配置。你可以理解为什么我在这里需要这个功能(stackoverflow.com/questions/60998072/...
HeyAlex
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.