Maven 发布一个 aar 嵌入 jar 库

Maven publish an aar embedding jar libs

我正在尝试将 aar 发布到我全新的私有 Maven 服务器。 我的aar依赖另一个aar,就是嵌入jar文件。

这里使用 Artifactory 的"good"(和工作..)方法是什么?

Main aar
  |
  |__ Shared aar
        |
        |__ Toy jar
        |
        |__ Totoy jar

当我尝试在 Android 应用程序中使用 Main 时,当它到达在 Shared 中使用的 class 时,我得到了一个很好但很残酷的错误:

java.lang.NoClassDefFoundError: Failed resolution of: [.. class embedded in Totoy jar]

我尝试了多种组合,比如在 maven 上发布 Shared,将其引用为 compile "com.myapp.Shared:1.0.0" 在 Main 中,对 Main 做同样的事情,或者只是将其引用为 compile (project_module)

我的 .jar 文件是否也应该发布到私有 Maven 并在 Daugther 中引用(这样我的所有依赖项都在我的 Maven 中)?

jar 是 Cling 和关联的依赖项(无缝),用于 Shared 中的一些 classes,从 Main aar 调用。

当我发布共享库并直接在示例中使用它时,我没有遇到同样的错误(这意味着崩溃没有发生,只有当我使用主库时才会发生,它本身嵌入了共享库).

当所有这些都定义在一个项目中以统治它们并且所有编译顺序都被定义为 "internal module" 依赖项时,它工作正常,我猜问题出在共享库的 jar 上,但是没有找到解决方法...

感谢您的帮助!

编辑

我成功了,请看我的回答。

所以,我设法让它工作了:

  1. 我删除了 libs 目录中的 .jar 并添加了 Cling 和 jetty dep 作为 maven 依赖项。我想如果你有一个自定义 jar,你应该做同样的事情并将它发布到你的 Maven 存储库。

  2. 我跟踪了另一个java.lang.NoClassDefFoundError:Art不像Delvik那样健谈。

我的问题是我在我的 Main.aar 中使用了来自 Cling 库的一些 class,并且在发布到 Maven 时依赖性没有像我想的那样传递(但是当本地编译)。所以将 Cling 添加为 Main.aar 的 dep 解决了我的问题。< br/> 这将作为一个教训,让我更仔细地跟踪我的部门。

需要记住的是,生成的默认 .pom 文件不会包含对您的发布的依赖项:您必须在 gradle 任务中添加此类内容:

publishing {
    publications {
        aar(MavenPublication) {
            groupId packageName
            version = libraryVersion
            artifactId project.getName()

            // Tell maven to prepare the generated "*.aar" file for publishing
            artifact("$buildDir/outputs/aar/$artifactId-release.aar")

            //The publication doesn't know about our dependencies, so we have to manually add them to the pom
            pom.withXml {
                // for dependencies and exclusions
                def dependenciesNode = asNode().appendNode('dependencies')
                configurations.compile.allDependencies.each { dp ->
                    def dependencyNode = dependenciesNode.appendNode('dependency')
                    dependencyNode.appendNode('groupId', dp.group)
                    dependencyNode.appendNode('artifactId', dp.name)
                    dependencyNode.appendNode('version', dp.version)
                }
            }
        }
    }
}

此外,请记住 gradle 将简单地忽略您在 .pom 中添加的任何存储库。所以在我的例子中,由于 Cling 不在 jcenter 或 MavenCentral 上,我必须在我的库的 gradle 中添加 Cling 存储库,但是该库的未来用户也必须添加它(或者 Cling 依赖项将未解决。)