如何在摇篮定义编译时仅* *类路径?如何在摇篮定义编译时仅* *类路径?(How do I defi

2019-05-13 17:55发布

有人可以给我的我怎么能指定编译只是时间未包含在运行时部署(战争)类的简单的build.gradle例子。

摇篮似乎因为“运行时”已经得到解决,这种错误的方式从“编译”继承。 我无法想象一个情况,我想在运行时类,我不希望在编译时。 不过,也有很多情况下,我需要的类在编译时产生的代码,我不希望在运行时部署!

我已经通过了臃肿的gradle这个文档耕种,但无法找到任何明示或实例。 我怀疑这可能通过定义一个“配置”,将其设置为CompileJava插件的类路径来实现 - 但文档达不到讲解如何实现这一目标。

Answer 1:

已经有关于这个话题的讨论很多,主要是在这里 ,但没有明确的结论。

你是在正确的轨道上:目前最好的解决办法是声明自己provided的配置,包括这将汇编只依赖,并添加到您的编译类路径:

configurations{
  provided
}

dependencies{
  //Add libraries like lombok, findbugs etc
  provided '...'
}

//Include provided for compilation
sourceSets.main.compileClasspath += [configurations.provided]

// optional: if using 'idea' plugin
idea {
  module{
    scopes.PROVIDED.plus += [configurations.provided]
  }
}

// optional: if using 'eclipse' plugin
eclipse {
  classpath {
    plusConfigurations += [configurations.provided]
  }
}

通常,这工作得很好。



Answer 2:

如果您使用的战争插件, providedCompile应该做的伎俩。 不过,如果你需要从被包含在一个罐子里排除依赖,你就必须延长jar任务。 下面是不含depndencies标记为构建“脂肪罐”或“超级罐”(单罐,其包括它的依赖的所有类)的例子provided

configurations {
    provided
    compile.extendsFrom provided
}

dependencies {
    provided "group.artifact:version"
    compile "group.artifact:version"
}

jar {
    dependsOn configurations.runtime
    from {
        (configurations.runtime - configurations.provided).collect {
            it.isDirectory() ? it : zipTree(it)
        }
    } 
}

信用: http://kennethjorgensen.com/blog/2014/fat-jars-with-excluded-dependencies-in-gradle/

更新:

由于摇篮2.12的定义只编译依赖的问题终于解决了通过新的“copmpileOnly”配置一个简单而自然的方式:

dependencies {
    compileOnly 'javax.servlet:servlet-api:2.5'
}


Answer 3:

我想通了我的项目设置。 我使用Android工作室与gradle这个插件运行0.9 +与gradle这个1.11的主要项目使用亚马逊的广告和亚马逊应用程式内购买。 这取决于使用亚马逊设备消息(ADM)库项目。

我的主要问题是与在那里我得到了在ADM“的RuntimeException:存根” 错误。

1)图书馆工程:“提供的配置”由卢卡斯提出不工作,由他说,所以我用理查兹的办法,然而这并没有工作,以及开箱即用。 我不得不改变了一点,因为我无法找到在AAR文件的文件夹ext_libs的lib。 摇篮似乎收拾libs文件夹中的所有库的最终AAR文件。

android.libraryVariants.all { variant ->
variant.packageLibrary.exclude( 'libs/amazon-device-messaging-1.0.1.jar' )
}

2)申请项目:在这里,用“提供的配置”的方式工作。

configurations{
    provided
} 
dependencies {
    compile 'fr.avianey:facebook-android-api:+@aar'
    compile files('ext_libs/amazon-ads-5.3.22.jar')
    compile files('ext_libs/in-app-purchasing-1.0.3.jar' )
    provided files('ext_libs/amazon-device-messaging-1.0.1.jar')
}

android.applicationVariants.all {
    variant -> variant.javaCompile.classpath += configurations.provided
}


Answer 4:

这是很常见的运行时依赖未编译时的依赖。 其他的方式是一个相当特殊的情况,因此需要配置的摇篮几行。 我建议搜索摇篮论坛的provided

这听起来像你真正后声明依赖于您的构建 ,而不是为编译类路径。 如何做到这一点取决于所期望的功能如何得到调用(Ant任务,摇篮任务/插件,即席从构建脚本中使用)。 如果你提供你正在尝试做更详细的信息,我可以提供一个更具体的答案。

下面是一些链接到摇篮用户手册中的相关信息:

  • 为构建脚本外部依赖
  • 声明自定义Ant任务的类路径


Answer 5:

如果您使用WAR插件,你可以使用providedCompile如本例

dependencies {
    compile module(":compile:1.0") {
        dependency ":compile-transitive-1.0@jar"
        dependency ":providedCompile-transitive:1.0@jar"
    }
    providedCompile "javax.servlet:servlet-api:2.5"
    providedCompile module(":providedCompile:1.0") {
        dependency ":providedCompile-transitive:1.0@jar"
    }
    runtime ":runtime:1.0"
    providedRuntime ":providedRuntime:1.0@jar"
    testCompile "junit:junit:4.11"
    moreLibs ":otherLib:1.0"
}


Answer 6:

在摇篮2.12 compileOnly配置已经出台。 博客文章介绍这个功能可以在这里找到:

摇篮的最新功能:编译仅依赖

请注意一个重要的副作用:

由于添加了“compileOnly”配置的结果是,“编译”的配置不再代表所有的全貌编译时间依赖性。 当需要引用构建脚本或自定义插件编译类路径,适当的源集的compileClasspath财产应改为使用。



Answer 7:

事实证明,他们在gradle这个Android插件0.8.0增加了“提供的”配置,但它不是做得比较工作。 它提供的库会自动添加到编译路径,但它也包括他们在最后的AAR / APK。

什么工作对我来说是由@卢卡斯 - hanaceck而是从“提供”给任何其他自定义名称更改名称提供的解决方案。 在我而言,这是一个图书馆项目,这是我的最终版本的Android应用程序项目的依赖。 继承人为我工作要点。

configurations {
   providedlibs
}

dependencies {
   providedlibs files('provided/library.jar')
}

libraryVariants.all {
    variant -> variant.javaCompile.classpath += configurations.providedlibs
}

它编译完美和提供/ library.jar不包含在最终的apk。 我遇到的唯一问题是通知library.jar存在的Android的工作室。 这个想法插件似乎并没有为Android工作室工作。 即时猜测他们有与工作室的gradle同步另一个自定义插件。



Answer 8:

我没有找到针对Android Studio中的一个解决方案,但这个是我的尝试:

在Android Studio中,我不得不更新到0.5版本。+

在gradle产出/ gradle-wrapper.properties更换

distributionUrl=http\://services.gradle.org/distributions/gradle-1.9-rc-3-bin.zip

通过

distributionUrl=http\://services.gradle.org/distributions/gradle-1.11-all.zip

在我所有的build.gradle更换

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.7.+'
    }
}

通过

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.9.+'
    }
}

在图书馆,我想利用提供

configurations {
    provided
}

//put applicationVariants in case it is apply plugin: 'android' and not apply plugin: 'android-library'
android.libraryVariants.all {
    variant -> variant.javaCompile.classpath += configurations.provided
}

dependencies {
    provided files('ext_libs/amazon-device-messaging-1.0.1.jar')
}

在它不工作的结束,似乎它适用于JAR而不是AAR或APK这里说https://groups.google.com/forum/#!topic/adt-dev/WIjtHjgoGwA



Answer 9:

在Android Studio中1.0做到这一点:

android.libraryVariants.all { variant ->
    variant.outputs.each { output ->
        output.packageLibrary.exclude('libs/someLib.jar')
    }
}


Answer 10:

我们不需要“规定”,尝试添加此:

android.libraryVariants.all { variant ->
    variant.packageLibrary.exclude( 'ext_libs/amazon-device-messaging-1.0.1.jar' )
}

请享用!



Answer 11:

该OP显然没有找一个Android的答案,但一些答案是具体到Android。 因此,我建议你看看这个页面: http://tools.android.com/tech-docs/new-build-system

0.9.0版本推出的提供范围。 因此,只要使用

dependencies {
    provided "groupId:artifcatId:version"
}


文章来源: How do I define a compile-time *only* classpath in Gradle?