【问题标题】:Copy tasks in build.gradle will not place compile dependencies in one directory and testCompile dependencies in anotherbuild.gradle 中的复制任务不会将编译依赖项放在一个目录中,而将 testCompile 依赖项放在另一个目录中
【发布时间】:2019-01-30 16:26:15
【问题描述】:

我是 Gradle 新手。

当我运行 build 时,构建不会将特定依赖项复制到特定目录,而是将 compiletestCompile 依赖项添加到 src/test/resources.

我希望能够仅将 test compile 依赖项复制到 src/test/resources 并将所有其他依赖项复制到 main/src/resources.

谢谢

apply plugin: 'java'
apply plugin: 'war'


String spring_version = "3.1.2.RELEASE@jar" ; 
String spring_sec_version = "3.1.2.RELEASE@jar" ; 
String hibernate_version = "4.1.7.Final@jar" ; 

repositories {
    mavenCentral()
}

//  "org.springframework:spring-oxm:"+spring_version,

List spring = [
    "org.springframework:spring-context:"+spring_version,
    "org.springframework:spring-beans:"+spring_version,
    "org.springframework:spring-core:"+spring_version,
    "org.springframework:spring-aop:"+spring_version,
    "org.springframework:spring-expression:"+spring_version,
    "org.springframework:spring-jdbc:"+spring_version,
    "org.springframework:spring-tx:"+spring_version,
    "org.springframework:spring-web:"+spring_version,
    "org.springframework:spring-webmvc:"+spring_version,
    "org.springframework:spring-orm:"+spring_version,
    "org.springframework:spring-asm:"+spring_version
] 

List spring_security = [
    "org.springframework.security:spring-security core:"+spring_sec_version,
    "org.springframework.security:spring-security-config:"+spring_sec_version,
    "org.springframework.security:spring-security-web:"+spring_sec_version
]

List spring_aop = [
    "aopalliance:aopalliance:1.0@jar",
    "cglib:cglib-nodep:2.2.2@jar"
]

List validation_lib = [
    "org.hibernate:hibernate-validator:4.3.0.Final@jar", 
    "javax.validation:validation-api:1.0.0.GA@jar"
]

List log_lib = [
    "org.jboss.logging:jboss-logging:3.1.2.GA@jar", 
    "org.slf4j:slf4j-api:1.6.6@jar",
    "org.slf4j:slf4j-jdk14:1.6.6@jar",
    "org.slf4j:log4j-over-slf4j:1.6.6@jar",
    "org.slf4j:jcl-over-slf4j:1.6.6@jar",
    "log4j:log4j:1.2.17@jar"
]

List hibernate_api = [
    "org.hibernate.javax.persistence:hibernate-jpa-2.0-api:1.0.1.Final@jar"
] 

List hibernate = [
    "org.jboss.spec.javax.transaction:jboss-transaction-api_1.1_spec:1.0.1.Final@jar",
    "org.hibernate.common:hibernate-commons-annotations:4.0.1.Final@jar",
    "org.javassist:javassist:3.16.1-GA",
    "org.hibernate:hibernate-entitymanager:"+hibernate_version,
    "org.hibernate:hibernate-core:"+hibernate_version
]

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.10'
    testCompile group: 'org.mockito', name: 'mockito-all', version: '1.10.19'
    compile hibernate_api
    compile hibernate
    compile spring 
    compile spring_security
    compile spring_aop
    compile "org.codehaus.jackson:jackson-jaxrs:1.9.9"  //lib jackson for JSON
    compile validation_lib
    compile log_lib
    runtime "postgresql:postgresql:9.1-901.jdbc4@jar"
    compile "rhino:js:1.7R2@jar"
}

task copyDependencies(type: Copy) {
    from (configurations.compile)
    into "src/main/resources"
}

task copyTestDependencies(type: Copy) {
    from (configurations.testCompile)
    into "src/test/resources"
}

build.dependsOn(copyDependencies)
build.dependsOn(copyTestDependencies)

【问题讨论】:

    标签: java gradle groovy


    【解决方案1】:

    回答前的两件事:

    • Gradle 配置 compiletestCompile 应替换为 implementationtestImplementation。有关详细信息,请参阅documentation。我的答案将使用这些来代替。
    • Gradle 有一个很好的工作避免方法,它基于输入/输出计算。将任何内容复制到作为任务输入的目录中,例如resources 目录,都会搞砸。您确实应该避免这样做,而是创建正确连接的新目录,以便在需要时使用。

    您遇到的问题是 testImplementation 扩展了 implementation,因此您会将 runtimetest 依赖项收集到测试依赖项的位置。

    • 最简单的方法是为您的测试依赖项创建自定义配置,以便您可以独立于运行时访问它们:

      configurations {
          testDependencies
          testImplementations {
              extendsFrom testDependencies
          }
      }
      
      dependencies {
          testDependencies group: 'junit', name: 'junit', version: '4.10'
          // And others
      }
      

      然后你会复制testDependencies的内容。

      这种方法的一个缺点是testDependencies 的分辨率不会受到运行时 依赖项的影响。这可能是个问题,但与上下文相关。

    • 另一个选项是在复制 test 依赖项时过滤 runtime 依赖项。如果您意识到运行时依赖项会影响测试依赖项的版本,则需要该解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-30
      • 2022-01-15
      • 1970-01-01
      • 2013-03-21
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多