将库(Smack)添加到Android Studio项目

4
由于我需要对 Smack 库进行一些更改,所以我想将 Smack 作为库添加到我的 Android Studio 项目中。 我从 Smack Github 存储库 下载了 ZIP 文件,并执行了以下步骤 - 步骤来自我的解决方案搜索结果:

(1) 在我的项目根目录中创建了一个新文件夹 libs,并将已提取并重命名的文件夹 /Smack 复制到了 libs 中。因此,现在它的结构如下所示:

root/libs/Smack/

(2) 我编辑了根目录下的settings.gradle文件

include ':app'
include ':libs:Smack'

(3) 通过 文件 -> 项目结构 -> 模块 app -> 依赖项,我已将 :libs:Smack 添加为模块依赖

(4) 我已在 root/app/build.gradle 中添加以下行:

compile project(':libs:Smack')

根据我在网上找到的大多数资料,这应该就是了。然而,我遇到了一个错误:Gradle project sync failed。更详细地说,我得到了以下信息:
/path-to-root/libs/Smack/build.gradle
Error:(42, 0) Project with path ':smack-integration-test' could not be found in project ':libs:Smack'.

当我查看文件和行时,它显示为project(':smack-integration-test')。但是,无法找到此内容。然而,有一个名为libs/Smack/smack-integration-test的文件夹。看起来非常简单,但我似乎在这里错过了一些关键内容。
编辑:实际上,Android Studio支持导入Gradle项目:文件 -> 新建 -> 新建模块会打开一个对话框窗口,在其中选择导入Gradle项目,然后必须选择此处的Smack源目录。这样做将在settings.gradle中生成所有正确的包含语句。
但是,现在我遇到了错误:
Error:(386, 0) Could not get unknown property 'clirr' for project ':smack-integration-test' of type org.gradle.api.Project.

因为我对Gradle不是很熟悉,所以我不知道这可能意味着什么,而且我的谷歌搜索也没有帮助我进展。

3个回答

1

我不确定是否建议将这两个项目创建为多模块构建。这可能无法按预期工作。您可能需要将smack settings.gradle中的大多数/全部模块添加到自己的settings.gradle中。如果您真的想这样做,我建议您使用prezi-pride从命令行管理此操作。

我不是Android用户,因此不确定Android插件可与哪些版本的Gradle一起使用。如果Android支持Gradle 3.1+,则可以使用新的composite build support。这是迄今为止最干净的解决方案,我建议采用这种方法。

另一个解决方案是分别构建项目,在您的项目中执行以下操作:

compile fileTree(dir: '../smack/project-1/build/lib', include: '*.jar')
compile fileTree(dir: '../smack/project-2/build/lib', include: '*.jar')
// etc

另一种解决方案是将Smack构件发布到Maven本地并从项目中引用它们。如果无法使用组合构建,则这可能是第二好的解决方案。

我已经在我的 settings.gradle 中添加了所有模块,例如 include ':libs:Smack:smack-integration-test',并且将它们全部作为模块依赖项添加(参见我的问题中的 (3))。但是没有任何变化,仍然出现相同的错误。 - Christian
就像我说的那样...可能不起作用。尝试使用(1)组合构建,(2)mavenLocal()或(3)prezi-pride。 - lance-java
我已经解决了最初的问题,但是遇到了下一个问题(请参见我在原始问题中的编辑)。自动导入确实将所有包含文件放在了settings.gradle中,就像您建议的那样,只是格式与我的尝试不同。 - Christian
将构建文件合并在一起的想法不太好。你是否使用Gradle 3.1+?使用组合构建,让生活更美好!如果不行,可以使用mavenLocal() - lance-java

1
我不会以这种方式添加项目,您可以将其作为单独的项目保留在项目文件夹结构之外,然后进行修改和构建。最简单的方法是将构建的jar文件复制到您的项目中并将其包含到gradle中:
对于jar文件,请在您的项目中创建libs文件夹并将文件复制到其中,gradle的包含方式如下:
compile fileTree(dir: 'libs', include: ['*.jar']) // for all of the jars in the libs folder
compile files('libs/xyz.jar') // for a specific file

回复内容存在敏感词^**$项目,您可以使用一个
gradle assemble

在它的根目录中

输出的 jar 文件位于每个特定的文件夹中,例如对于 Android,我看到:

smack-android\build\libs\

smack-android-extensions\build\libs\


我研究了一下。但是从Gradle项目创建JAR文件似乎并不是很直接的事情。我可能不得不这样做,我只是希望有一个快速的解决方案,即使它很粗糙,因为它只是用于测试目的。 - Christian
我在本地使用Smack库进行了测试,发现它非常简单。如果你在它的根目录下运行gradle命令,它将构建所有子项目。从那里,你可以从构建文件夹中选择与你相关的jar文件。 - petrumo
我已经接受了这个答案,因为通过这种方式取得了进展。我能够创建各种JAR文件并将其导入到我的项目中。然而,用相应的 compile files('libs/...jar') 替换 compile 'org.igniterealtime.smack:smack-android:4.1.0' 行在我的源代码中抛出了错误。我认为这些可能是不同的版本。 - Christian
它也可能与包含的 jar 文件有关,例如缺少某些内容。 - petrumo
我不知道。现在有一个方法抛出了异常,这个异常之前不需要被捕获。另一个方法则抱怨签名错误——一个输入参数之前是字符串,现在变成了某个类。源代码中存在很多这样的差异。 - Christian

0

这并不是解决您问题的方法,但可能有一个更好的解决方案:

jitpack.io 提供了将 GitHub 存储库添加到您的项目作为 Gradle 依赖项的功能,从而允许您省略手动添加 jar 的过程。 如何实现最好由 JitPack 自己描述。 简而言之: 将 JitPack 存储库添加到您的 build.gradle 中:

    repositories {
        ...
    maven { url 'https://jitpack.io' }
    }

现在您可以将 GitHub Repo 添加为依赖项:

    dependencies {
        compile 'com.github.igniterealtime:Smack:-SNAPSHOT'
    }

在刷新项目后,您应该能够按预期使用API。


我能修改Smack的源代码吗?到目前为止,我是通过在build.gradle中添加类似于compile 'org.igniterealtime.smack:smack-android:4.1.0'的依赖项来包含Smack。这个方法已经足够好用了,但我无法修改源代码。 - Christian
不会的 - Smack将作为一个jar文件添加到项目中。 - Lukas
编辑API源代码似乎无论如何都不是一个好的实践 - 就个人而言,我会选择Kotlin,并使用所需函数扩展API ;) - Lukas
我同意。这从来不是一个永久的解决方案。我只是为了测试目的,确认我遇到的连接问题是否确实(部分)由Smack实现中的细节问题引起。这样我就知道我走在正确的轨道上了。 - Christian
ERROR: Failed to resolve: com.github.igniterealtime:Smack:-SNAPSHOT - Roshana Pitigala

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