【问题标题】:Maven publish an aar embedding jar libsMaven 发布一个嵌入 jar 库的 aar
【发布时间】:2017-10-14 11:37:59
【问题描述】:

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

在这里使用 Artifactory 的“好”(和工作..)方法是什么?

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

当我尝试在 Android 应用程序中使用 Main 时,当它进入 Shared 中使用的类时,我遇到了一个不错且残酷的错误:

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 中的某些类,这些类是从 Main aar 调用的。

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

当所有这些都在一个项目中定义以统治它们并且所有编译命令都定义为“内部模块”依赖项时,它工作正常,我猜问题出在共享库的 jar 上,但没有找到解决方法...

感谢您的帮助!

编辑

我设法使它工作,请参阅我的答案。

【问题讨论】:

    标签: android maven jar artifactory aar


    【解决方案1】:

    所以,我设法让它工作:

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

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

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

    要记住的是,生成的默认 .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 上,我必须在我的 lib 的 gradle 中添加 Cling 存储库,但是 lib 的未来用户也必须添加它(否则 Cling 依赖项将无法解决。 )

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-29
      • 1970-01-01
      相关资源
      最近更新 更多