如何从Android Studio项目制作.jar文件


96

我正在使用AndroidStudio,并且具有如下所示的项目:

在此处输入图片说明

蓝色圆圈内的是myLib。myLib还需要使用红色圆圈内的外部库和apache包(绿色圆圈)。

所以我想将整个东西变成一个.jar,以便可以在其他项目中使用它。

我是开发人员领域的初学者,非常感谢您提供分步指南。

谢谢!


1
我认为您想要的是一个aar文件(Android存档),可以将它作为依赖项安静地链接。基本上,您需要创建一个Android库项目。但我无法从脑海中写下确切的步骤。
2014年

2
我需要一个.jar文件,因此可以在任何Java项目中使用。不仅是Android的。
dum4ll3

1
必须几乎相同-创建一个库项目并将其导出。
Thrash Bean 2014年

此错误描述了Android gradle插件中的一个缺陷,该缺陷可防止轻易破解gradle buildfile来添加jar目标...
mmigdol 2014年

Answers:


135
  • 打开库项目的build.gradle 在此处输入图片说明

  • 在build.gradle中编写两个任务-deleteJar和createJar并添加规则createJar.dependsOn(deleteJar,build) 在此处输入图片说明

上面的代码:

task deleteJar(type: Delete) {
    delete 'libs/jars/logmanagementlib.jar'
}           

task createJar(type: Copy) {
    from('build/intermediates/bundles/release/')
    into('libs/jars/')
    include('classes.jar')
    rename('classes.jar', 'logmanagementlib.jar')
}

createJar.dependsOn(deleteJar, build)
  • 从右侧展开gradle面板,然后在“ library”->“ others”下打开所有任务。您将在此处看到两个新任务-createJar和deleteJar 在此处输入图片说明

  • 双击createJar 在此处输入图片说明

  • 任务成功运行后,从createJar任务中提到的路径(即libs / xxxx.jar)获取生成的jar。 在此处输入图片说明

  • 将新生成的jar复制到所需项目的lib文件夹中->右键单击->选择“添加为库”


4
有时人们通过观看而不是阅读来理解。这是你看到☺一个很好的UX
阿比纳夫·特亚吉

5
好吧,那我应该告诉你我不确定release。我有debugdefault,但没有release文件夹。您正在使用哪个版本的插件?您知道这是否记录在任何地方吗?
卡梅隆·洛厄尔·帕尔默

3
我没有release文件夹。
Kamran Bigdely

4
您要复制什么?我们是否应该针对包含APK文件的文件夹?我的意思是从('build / intermediates / bundles / default')开始,该目录为您保留了什么。我的android studio中没有包含名称捆绑包的文件夹,并且在createJar任务中我没有得到任何消息
Bawender Yandra

12
将Android Studio 3.1.3和Gradle版本4.4从('build / intermediates / bundles / release /')更改为('build / intermediates / packaged-classes / release /')
Vaishakh

59

如果您在Gradle中将代码设置为纯Java模块,那么让Gradle为您提供包含内容的jar文件真的很容易。该jar文件将仅包含您的代码,而不包含它依赖的其他Apache库。我建议以这种方式分发它;将依赖项捆绑到您的库中有点奇怪,对于那些库的用户来说,必须自己包括这些依赖项是更正常的(因为否则,那些项目的冲突已经链接了库的副本,也许是不同版本的)。此外,如果要发布库,则可以避免在重新分发他人代码时可能出现的许可问题。

将同样需要编译到jar中的代码,然后将其移动到Android Studio中的单独的纯Java模块中:

  1. 文件菜单> 新建模块... > Java库
  2. 在向导中设置库,Java包名称和类名称。(如果您不希望它为您创建类,则可以在创建模块后将其删除)
  3. 在您的Android代码中,建立对新模块的依赖关系,以便它可以使用新库中的代码:
  4. 文件 > 项目结构 > 模块 > (您的Android模块) > 依赖关系 > + > 模块依赖关系。请参见下面的屏幕截图: 在此处输入图片说明
  5. 从出现的对话框的列表中选择模块: 在此处输入图片说明

希望您的项目现在应该可以正常构建。完成构建后,用于Java库的jar文件将放置在模块目录中的build / libs目录中。如果要手动构建jar文件,可以从Gradle窗口运行其jar构建文件任务: 在此处输入图片说明


非常感谢你!您的答案非常有帮助,在显示Gradle任务的最后一个屏幕截图中,大多数都是如此。我不知道 我可以按照您的步骤进行操作,但是仍然缺少org.apache.http.Header。如何将其导入到我的库中?
dum4ll3

你说想念它的意思是什么?
Scott Barta 2014年

1
经历相同的“项目结构”>“依赖项”流程,但是选择您的库模块而不是您的项目,并以相同的方式添加依赖项。在我的回答中,我说它将jar文件放在其模块目录的build / libs目录中。
Scott Barta 2014年

1
我得到了:java.lang.NoClassDefFoundError:com.loopj.android.http.RequestParams。那是我正在用我的外部库编译。
dum4ll3

2
它仅适用于Java库,并且不存在Android库中的jar任务
cuasodayleo 2015年

26

在Android Studio IDE中,通过以下方式访问“ 运行任何工具栏 ”:

CTRL+ CTRL+ gradle CreateFullJarRelease+ENTER

之后,您将在项目的此文件夹中找到人工制品
Build > Intermediates > Full_jar > Release > CreateFullJarRelease > full.jar


要么


Gradle 文件夹Task的gradle侧面菜单中已经有一个用于此的对象other

gradle工具栏

然后向下滚动到createFullJarRelease并单击它。

Gradle任务

之后,您将在项目的此文件夹中找到人工制品

Build > Intermediates > Full_jar > Release > CreateFullJarRelease > full.jar


2
看不到此选项。这是否已添加到Studio的最新版本中?
Dibzmania

1
我建立,当发现* .jar时,它的名字是:full.jar。30分钟找到它大声笑
nobjta_9x_tq

1
就我而言,我在build\intermediates\intermediate-jars\release
Yusril Maulidan Raji

我有个问题。就我而言,它会生成3个jar文件。classes.jarfull.jarres.jar。我是否应该在需要使用时导入所有jar文件?
尤斯里尔·毛里丹·拉吉

只需使用full.jar
Haroun Hajem,

11

只需将其添加到Java模块的build.gradle中即可。它将在存档中包含从属库。

mainClassName = "com.company.application.Main"

jar {
  manifest { 
    attributes "Main-Class": "$mainClassName"
  }  

  from {
    configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
  }
}

这将导致[module_name] / build / libs / [module_name] .jar文件。


但是.jar库是否有Main类?OP表示他们正在构建.jar文件,“以便我可以在其他项目中使用”(原文如此)。听起来像图书馆。
史蒂夫·怀特

只有这个人实际上了解到,只是jar创建并不能解决问题。如果我们需要执行该怎么办。上面的代码避免了“无法执行jar文件:“没有主清单属性””错误。
MobileEvangelist

1

当您编译/运行您的应用程序时,.jar文件将自动生成。

您可以从root_folder / app / build / intermediates / bundles / debug中找到您的class.jar文件

jar文件位置


1
  1. 转到Android Studio中的Gradle选项卡,然后选择库项目。

  2. 然后转到任务

  3. 然后去其他

  4. 双击捆绑包

您可以.aar在下面找到文件your_module/build/outputs/aar/your-release.aar

这里的图片


我在任何地方都看不到任何“成绩标签”。最后,我在“帮助”搜索中输入了“ Gradle”,并得到了类似您的Gradle视图的内容。但是里面的列表非常不同,比您的列表短得多。在“任务”->“其他”下没有bundleReleaseaar。有一个“ createJar”,但是当我单击它时,我得到“在根项目中找不到任务'createJar'...”,我被卡住了。还有...为什么我们要.aar文件?OP要求提供一个.jar文件。是同一件事吗?
史蒂夫·怀特

但问题是如何使.jar不做.aar
亚历山大·季莫申科

0

我发现的方式是找到项目编译器输出(项目结构>项目)。然后找到要转到jar的模块的编译文件夹,用zip压缩并将输出的扩展名从zip更改为jar。


0
task deleteJar(type: Delete) {
    delete 'libs/mylibrary.jar'
}           

task exportjar(type: Copy) {
    from('build/intermediates/compile_library_classes/release/')
    into('libs/')
    include('classes.jar')
    rename('classes.jar', 'mylibrary.jar')
}

exportjar.dependsOn(deleteJar, build)

0

如果您从AndroidStudio运行gradle任务[更多]

assembleRelease 
//or
bundleReleaseAar

或通过终端

./gradlew <moduleName>:assembleRelease
//or
./gradlew <moduleName>:bundleReleaseAar

那么你将能够找到.aar

<project_path>/build/outputs/aar/<module_name>.aar
//if you do not see it try to remove this folder and repeat the command

.aar(Android库)文件由.jar(Java库)文件和其他Android资源组成。.aar文件是一个带有aar扩展名的zip文件,这就是为什么您可以替换.aar.zip或运行该文件的原因

unzip "<path_to/module_name>.aar"
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.