【问题标题】:How to make a .jar out from an Android Studio project如何从 Android Studio 项目中制作 .jar
【发布时间】:2014-03-09 21:07:29
【问题描述】:

我正在使用 AndroidStudio,我有这个项目,如图所示:

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

所以我想把整个东西变成一个.jar,这样我就可以在其他项目中使用它了。

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

谢谢!

【问题讨论】:

  • 我认为你想要的是一个 aar 文件(Android 存档),它可以像依赖项一样简单地链接。基本上你需要创建一个 Android 库项目。但我无法从脑海中写出确切的步骤。
  • 我需要一个 .jar 文件,以便可以在任何 java 项目中使用。不仅是安卓的。
  • 必须几乎相同 - 创建一个库项目并将其导出。
  • This bug 描述了 Android gradle 插件中的一个缺陷,该缺陷会阻止轻松破解 gradle 构建文件以添加 jar 目标...

标签: java android jar android-studio


【解决方案1】:
  • 为库项目打开 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 面板并打开 yourlibrary->others 下的所有任务。您将在那里看到两个新任务——createJar 和 deleteJar

  • 双击createJar

  • 一旦任务成功运行,从 createJar 任务中提到的路径获取生成的 jar,即 libs/xxxx.jar

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

【讨论】:

  • 有时人们通过观看而不是阅读来理解。这是一个很好的用户体验☺
  • 好吧,那么我应该告诉你,我不确定release。我有debugdefault,但没有release 文件夹。你用的是什么版本的插件?你知道这是否记录在任何地方?
  • 我没有release 文件夹。
  • 你想复制什么??我们是否应该定位包含 APK 文件的文件夹?我的意思是从('build/intermediates/bundles/default')这个目录为你保存了什么。我的 android studio 中没有名为 bundles 的文件夹,并且我在 createJar 任务中不断收到 NO SOURCE
  • 对于 Android Studio 3.1.3 和 Gradle 版本 4.4 从('build/intermediates/bundles/release/') 更改为 from('build/intermediates/packaged-classes/release/')跨度>
【解决方案2】:

如果您在 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。如何将其导入到我的库中?
  • 你说你想念它是什么意思?
  • 通过相同的项目结构 > 依赖流程,但选择您的库模块而不是您的项目,并以相同的方式添加依赖项。在我的回答中,我说它将 jar 文件放在其模块目录中的 build/libs 目录中。
  • 我得到:java.lang.NoClassDefFoundError:com.loopj.android.http.RequestParams。那是我正在用我的外部库进行编译。
  • 它只适用于java库,android库中的jar任务不存在
【解决方案3】:

在 Android Studio IDE 中,通过以下方式访问“Run Anything 栏”:

CTRL+CTRL +gradle CreateFullJarRelease+ENTER

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



Gradle 已经在 other 文件夹下的 gradle 侧面菜单中为此提供了一个 Task

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

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

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

【讨论】:

  • 看不到这个选项。这是在最近的 Studio 版本中添加的吗?
  • 我构建并找到 *.jar 时它的名称是:full.jar。 30分钟找到它大声笑
  • 就我而言,我在build\intermediates\intermediate-jars\release找到它
  • 我有一个问题。就我而言,它会生成 3 个 jar 文件。 classes.jarfull.jarres.jar。我应该在我想使用的时候导入所有的 jar 文件吗?
  • 我的输出在 app/build 而不是 build
【解决方案4】:

只需将它添加到您的 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 并不能解决问题。如果我们需要执行它怎么办。上面的代码避免了“Can't execute jar-file: “no main manifest attribute””错误。
【解决方案5】:

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

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

【讨论】:

    【解决方案6】:
    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)
    

    【讨论】:

      【解决方案7】:
      1. 转到 Android Studio 中的 Gradle 选项卡,然后选择库项目。

      2. 然后转到任务

      3. 然后转到其他

      4. 双击bundleReleaseaar

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

      【讨论】:

      • 我在任何地方都看不到任何“Gradle 选项卡”。最后,我在帮助搜索中输入了“Gradle”,得到了类似 Gradle 视图的内容。但是里面的列表很不一样,比你的要短得多。 Tasks->Other下没有bundleReleaseaar。有一个“createJar”,但是当我点击它时,我得到“在根项目中找不到任务'createJar'......”我被卡住了。而且...为什么我们需要 .aar 文件? OP 要求提供 .jar 文件。是一样的吗>
      • 但问题是如何使.jar 不是.aar
      【解决方案8】:

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

      【讨论】:

        【解决方案9】:

        如果你使用

        apply plugin: 'com.android.library'
        

        您可以转换.aar -> .jar

        如果您从 AndroidStudio[More] 运行 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[About] 文件是带有 aar 扩展名的 zip 文件,这就是为什么您可以将 .aar 替换为 .zip 或运行

        unzip "<path_to/module_name>.aar"
        

        【讨论】:

          【解决方案10】:

          我有一个补充; 在新版Android Studio中(对我来说是:Android Studio北极狐|2020.3.1补丁3 构建 #AI-203.7717.56.2031.7784292,构建于 2021 年 10 月 1 日) 在 gradle 面板中,它默认没有任务。 进入Android Studio---设置---实验---Gradle选项卡,取消勾选“Do not build Gradle task list during Gradle sync”,然后点击File--Sync project with Gradle files,任务出现在Gradle面板中。

          然后按照答案:https://stackoverflow.com/a/52681317/4065069

          【讨论】:

            【解决方案11】:

            如果accepted answer 不适合您

            使用这个

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

            不是这个

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-12-05
              • 2020-06-14
              • 2012-07-06
              • 1970-01-01
              • 2015-05-28
              • 2015-05-16
              • 1970-01-01
              相关资源
              最近更新 更多