添加一个';提供';使用gradle配置kotlin/java库

添加一个';提供';使用gradle配置kotlin/java库,gradle,kotlin,Gradle,Kotlin,我有一个java库,我使用gradle添加了一个“提供的”配置 apply plugin: 'java' apply plugin: 'idea' apply plugin: 'checkstyle' apply from: file('../gradle/gradle-mvn-push.gradle') sourceCompatibility = JavaVersion.VERSION_1_7 targetCompatibility = JavaVersion.VERSION_1_7 r

我有一个java库,我使用gradle添加了一个“提供的”配置


apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'checkstyle'
apply from: file('../gradle/gradle-mvn-push.gradle')

sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_7

repositories {
    mavenCentral()
}

group = GROUP
version = VERSION_NAME

configurations {
    provided
}

sourceSets {
    main.compileClasspath += configurations.provided
    test.compileClasspath += configurations.provided
    test.runtimeClasspath += configurations.provided
}
javadoc.classpath += configurations.provided

idea {
    module {
        scopes.PROVIDED.plus += [configurations.provided]
    }
}

checkstyle {
    configFile = new File(rootDir, 'checkstyle.xml')
    toolVersion = '6.7'
}

dependencies {
    provided 'com.google.android:android:2.3.1'
    compile 'com.squareup:javawriter:2.5.0'
    compile 'com.workday:metajava:1.0'
}
使用此设置时,一切正常

现在我想在我的库中开始使用kotlin,所以我修改了构建脚本,使其看起来像这样(sans pluses)

即使不添加任何kotlin文件(即使我添加了),库也不再编译,说它在提供的库中找不到类(在我的例子中是android)


我需要更改什么才能获得它,以便再次识别提供的依赖项?

这就是我在Gradle插件中的操作方式:

private void addProvidedConfiguration() {
  final Configuration provided =
      addConfiguration(project.configurations, "provided)
  final Javadoc javadoc =
      project.tasks.getByName(JavaPlugin.JAVADOC_TASK_NAME) as Javadoc
  javadoc.classpath = javadoc.classpath.plus(provided)
}

private static Configuration addConfiguration(
    final ConfigurationContainer configurations, final String name) {
  final Configuration compile =
      configurations.getByName(JavaPlugin.COMPILE_CONFIGURATION_NAME)
  final Configuration configuration = configurations.create(name)

  compile.extendsFrom(configuration)
  configuration.visible = false
  configuration.transitive = false

  configuration.allDependencies.all { final dependency ->
    configurations.default.exclude(group: dependency.group, module: dependency.name)
  }

  return configuration
}
您可以检查源代码打开。

这将
添加到Gradle,并处理它与IntelliJ IDEA和Eclipse的集成。它来自Spring团队,有很多用途

您应该在
propdeps
之后应用
kotlin
插件

我还没有用Android库测试过这一点,但这是一个比尝试使用自己的库安全得多的赌注。没有什么特殊情况需要处理

另一个也被大量使用的插件是谁有许多插件可用于Gradle的不同有用添加。此插件添加了相同的
提供的
可选的


这是一个很好的提醒,Gradle的老问题仍然悬而未决6年,请随时提供您对缺少此功能的看法。

有趣的方法-既然您“提供”了Android框架API,我想您想创建一个Android库?如果我错了,请纠正我,但是您不能使用普通的Android库项目吗?Kotlin集成可以很好地用于此类项目。但也许我错过了一个你需要的需求?@SteffenFunke,这个库是一个使用注释处理器的代码生成库,所以它不可能是一个真正的android库。如果你想看的话,完整的东西是打开的。不要使用自定义代码,而是使用一个为Gradle预先构建的很好的可用插件来实现这一点。我在下面添加了信息。
private void addProvidedConfiguration() {
  final Configuration provided =
      addConfiguration(project.configurations, "provided)
  final Javadoc javadoc =
      project.tasks.getByName(JavaPlugin.JAVADOC_TASK_NAME) as Javadoc
  javadoc.classpath = javadoc.classpath.plus(provided)
}

private static Configuration addConfiguration(
    final ConfigurationContainer configurations, final String name) {
  final Configuration compile =
      configurations.getByName(JavaPlugin.COMPILE_CONFIGURATION_NAME)
  final Configuration configuration = configurations.create(name)

  compile.extendsFrom(configuration)
  configuration.visible = false
  configuration.transitive = false

  configuration.allDependencies.all { final dependency ->
    configurations.default.exclude(group: dependency.group, module: dependency.name)
  }

  return configuration
}