首页 文章

Maven库的可选Gradle依赖项

提问于
浏览
11

我正在开发一个Android库,并且只有在使用我的库的项目包含该依赖项时才想使用依赖项 . 与PicassoOkHttp的作用类似 .

我已经通过检查ClassNotFoundExceptions在主代码上处理了这个问题,但它仍然包括将它部署到Maven Central时的依赖关系 . 如何生成Maven的 <optional>true</optional> 标签等内容?

我正在使用gradle-mvn-push通过Gradle部署我的工件 .

2 回答

  • 16

    Nebula Extra Configurations Gradle plugin似乎提供了可选项 .

    你会像这样使用它:

    apply plugin: 'java'
    apply plugin: 'nebula.optional-base'
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
        compile 'org.apache.commons:commons-lang3:3.3.2', optional
        compile group: 'log4j', name: 'log4j', version: '1.2.17', optional
    }
    
  • 5

    投票给GRADLE-1749 .

    同时您可以使用 pom.withXml 方法修改生成的pom文件,例如添加 <optional> 标签或更改 <scope> 值:

    apply plugin: 'java'
    apply plugin: 'maven-publish'
    
    configurations {
      optional
      compile.extendsFrom optional
    }
    
    dependencies {
      compile 'com.some.group:artifact:1.0';
      optional 'com.another.group:optional-artifact:1.0'
    }
    
    publishing {
      publications {
        maven( MavenPublication ) {
          from components.java
    
          pom.withXml {
            asNode().dependencies.dependency.findAll { xmlDep ->
              // mark optional dependencies
              if ( project.configurations.optional.allDependencies.findAll { dep ->
                xmlDep.groupId.text() == dep.group && xmlDep.artifactId.text() == dep.name
              } ) {
                def xmlOptional = xmlDep.optional[ 0 ];
                if ( !xmlOptional ) {
                  xmlOptional = xmlDep.appendNode( 'optional' )
                }
                xmlOptional.value = 'true';
              }
    
              // fix maven-publish issue when all maven dependencies are placed into runtime scope
              if ( project.configurations.compile.allDependencies.findAll { dep ->
                xmlDep.groupId.text() == dep.group && xmlDep.artifactId.text() == dep.name
              } ) {
                def xmlScope = xmlDep.scope[ 0 ];
                if ( !xmlScope ) {
                  xmlScope = xmlDep.appendNode( 'scope' )
                }
                xmlScope.value = 'compile';
              }
            }
          }
        }
      }
    }
    

相关问题