Как добавить maven манифест в AAR, который определяет зависимости - PullRequest
0 голосов
/ 21 декабря 2018

Я (наконец) смог опубликовать свою библиотеку Android в репозитории AWS S3 maven, используя это руководство.Он публикуется в виде AAR вместо файла JAR, что означает, что, хотя в сгенерированном файле POM перечислены все его внутренние зависимости, они игнорируются при добавлении библиотеки в другой проект.Похоже, довольно распространенная проблема.Из этого я понимаю, что мне просто нужно перечислить зависимости в манифесте maven , но как это сделать?

Я действительно новичок в этом,так что чем проще, тем лучше ... Спасибо!

Примечание: я также нашел этот вопрос, поэтому я добавил "{transitive = true}" в конце строки реализации зависимости исработало.

Так что теперь, чтобы успешно включить мою библиотеку, зависимость должна быть закодирована следующим образом:

implementation (group: 'com.mygroup', name: 'my_library', version: '1.3', ext: 'aar', classifier: 'release') { transitive=true changing=true }

(я включил «change = true», чтобы заставить его повторно загружать библиотеку каждый развремя.)

Если я не включу «transitive = true», я получаю следующие ошибки:

    02-04 20:11:48.462 10225-10225/com.mydomain.app.testapplication4 E/dalvikvm: Could not find class 'android.graphics.drawable.RippleDrawable', referenced from method android.support.v7.widget.AppCompatImageHelper.hasOverlappingRendering
    02-04 20:14:07.080 10225-10225/com.mydomain.app.testapplication4 E/dalvikvm: Could not find class 'android.app.NotificationChannel', referenced from method com.mydomain.library.mydomain$1.onReceive
    02-04 20:14:07.290 10225-10225/com.mydomain.app.testapplication4 E/AndroidRuntime: FATAL EXCEPTION: main
        java.lang.NoClassDefFoundError: com.google.firebase.iid.FirebaseInstanceId
            at com.mydomain.library.MyActivity.onCreate(MyActivity.java:88)
            at android.app.Activity.performCreate(Activity.java:4701)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1051)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1924)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1985)
            at android.app.ActivityThread.access$600(ActivityThread.java:127)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1151)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4477)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:788)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
            at dalvik.system.NativeStart.main(Native Method)

Вот последний скрипт, который я использовал для публикации библиотеки (обратите внимание, чтоон только публикует сборку релиза, но для строки зависимостей по-прежнему требуется классификатор release):

    apply plugin: 'maven-publish'

    group = 'com.mydomain'
    version = '1.3'

    // Add sources as an artifact
    task sourceJar(type: Jar) {
        from android.sourceSets.main.java.srcDirs
        classifier "source"
    }

    // Loop over all variants
    android.libraryVariants.all { variant ->
        if (variant.buildType.name == "release") { // only release build
        variant.outputs.all { output ->
            // This creates a publication for each variant
            publishing.publications.create(variant.name, MavenPublication) {
                // The sources artifact from earlier
                artifact sourceJar

                // Variant dependent artifact, e.g. release, debug
                artifact source: output.outputFile, classifier: output.name

                // Go through all the dependencies for each variant and add them to the POM
                // file as dependencies
                pom.withXml {
                    final dependenciesNode = asNode().appendNode('dependencies')

                    ext.addDependency = { Dependency dep, String scope ->
                        if (dep.group == null || dep.version == null || dep.name == null || dep.name == "unspecified")
                            return // ignore invalid dependencies

                        final dependencyNode = dependenciesNode.appendNode('dependency')
                        dependencyNode.appendNode('groupId', dep.group)
                        dependencyNode.appendNode('artifactId', dep.name)
                        dependencyNode.appendNode('version', dep.version)
                        dependencyNode.appendNode('scope', scope)

                        if (!dep.transitive) {
                            // If this dependency is transitive, we should force exclude all its dependencies them from the POM
                            final exclusionNode = dependencyNode.appendNode('exclusions').appendNode('exclusion')
                            exclusionNode.appendNode('groupId', '*')
                            exclusionNode.appendNode('artifactId', '*')
                        } else if (!dep.properties.excludeRules.empty) {
                            // Otherwise add specified exclude rules
                            final exclusionNode = dependencyNode.appendNode('exclusions').appendNode('exclusion')
                            dep.properties.excludeRules.each { ExcludeRule rule ->
                                exclusionNode.appendNode('groupId', rule.group ?: '*')
                                exclusionNode.appendNode('artifactId', rule.module ?: '*')
                            }
                        }
                    }

                    // List all "compile" dependencies (for old Gradle)
                    configurations.compile.getDependencies().each { dep -> addDependency(dep, "compile") }
                    // List all "api" dependencies (for new Gradle) as "compile" dependencies
                    configurations.api.getDependencies().each { dep -> addDependency(dep, "compile") }
                    // List all "implementation" dependencies (for new Gradle) as "runtime" dependencies
                    configurations.implementation.getDependencies().each { dep -> addDependency(dep, "runtime") }
                }
            }
        }
        }
    }

    // Ensure that the publish task depends on assembly
    tasks.all { task ->
        if (task instanceof AbstractPublishToMaven) {
            task.dependsOn assemble
        }
    }

    // Configure the destination repository with
    // S3 URL and access credentials
    publishing {
        // Properties properties = new Properties()
        // properties.load(file('maven.properties').newDataInputStream())

        repositories {
            maven {
                url "s3://androidsdk.mydomain.com.s3.amazonaws.com"
                credentials(AwsCredentials) {
                    accessKey "myaccesskey"
                    secretKey "mysecretkey"
                }
            }
        }
    }

Вот зависимости в файле библиотеки gradle.build:

    dependencies {
        api fileTree(include: ['*.jar'], dir: 'libs')
        api 'com.android.support:appcompat-v7:27.1.1'
        api 'com.android.support.constraint:constraint-layout:1.1.3'
        api 'com.android.support:design:27.1.1'
        api 'io.reactivex.rxjava2:rxandroid:2.1.0'
        api 'io.reactivex.rxjava2:rxjava:2.2.4'
        api 'com.github.instacart.truetime-android:library-extension-rx:3.3'
        api 'com.google.dagger:dagger-android:2.15'
        annotationProcessor 'com.google.dagger:dagger-android-processor:2.15'
        annotationProcessor 'com.google.dagger:dagger-compiler:2.15'
        api 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
        api 'com.google.firebase:firebase-core:16.0.7'
        api 'com.google.firebase:firebase-messaging:17.3.4'
    }

Я думал, что сгенерированный файл POM ниже может не соответствовать зависимости библиотекино они делают.Теги «scope» в файле POM должны устранить необходимость в «transitive = true», верно?

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mydomain</groupId>
  <artifactId>my_library</artifactId>
  <version>1.3</version>
  <packaging>pom</packaging>
  <dependencies>
    <dependency>
      <groupId>com.android.support</groupId>
      <artifactId>appcompat-v7</artifactId>
      <version>27.1.1</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.android.support.constraint</groupId>
      <artifactId>constraint-layout</artifactId>
      <version>1.1.3</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.android.support</groupId>
      <artifactId>design</artifactId>
      <version>27.1.1</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>io.reactivex.rxjava2</groupId>
      <artifactId>rxandroid</artifactId>
      <version>2.1.0</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>io.reactivex.rxjava2</groupId>
      <artifactId>rxjava</artifactId>
      <version>2.2.4</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.github.instacart.truetime-android</groupId>
      <artifactId>library-extension-rx</artifactId>
      <version>3.3</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.google.dagger</groupId>
      <artifactId>dagger-android</artifactId>
      <version>2.15</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.nostra13.universalimageloader</groupId>
      <artifactId>universal-image-loader</artifactId>
      <version>1.9.5</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.google.firebase</groupId>
      <artifactId>firebase-core</artifactId>
      <version>16.0.6</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.google.firebase</groupId>
      <artifactId>firebase-messaging</artifactId>
      <version>17.3.4</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
</project>

1 Ответ

0 голосов
/ 04 января 2019

Вы сможете решить эту проблему, изменив генерацию POM XML так, чтобы раздел <packaging> был настроен как aar, а не pom:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.humanvideoboard</groupId>
  <artifactId>hvb_library</artifactId>
  <version>1.0</version>
  <packaging>aar</packaging>

Однако теперь, когда я 'Повторно исследуя это, причина, по которой он работает с transitive зависимостями, заключается в использовании implementation против api при сборке библиотеки или при создании вещи, которая использует библиотеку.Если ваша библиотека предоставляет типы из своих зависимостей как часть своего открытого API, то эти зависимости сборки должны корректно обрабатываться в вашей сборке библиотеки.См. эту страницу для получения дополнительной информации.

...