使用Gradle在

时间:2019-02-13 17:05:26

标签: java gradle

我有一个Gradle侧面版本,可以在我拥有的另一个旧Ant版本上运行一些测试。那个旧的ant构建中有一个 TON 库,我希望运行测试的我的Gradle构建在运行测试工具(在本例中为黄瓜)时,将其包含在其类路径中。但是,使庞大的依赖项列表保持同步似乎容易出错,并且将Ant构建转换为统一的Gradle构建现在还不是真正可行的事情(如我所愿)。

因此,我想我可以简单地在JavaExec包装器的类路径中引用Ant构建中的jar文件。似乎很简单,所以我尝试了这个:

javaexec {
    ...
    classpath = sourceSets.main.output +
                sourceSets.test.output +
                fileTree(dir: libPath, include: '*.jar')
}

libPath是Ant构建的lib目录的路径,该目录包含所有jar文件。但是,由于这里的依赖项数量巨大,因此我在执行时会得到一个可爱的运行时异常:

Caused by: java.io.IOException: Cannot run program "C:\Java\jdk1.8.0_161\bin\java.exe" (in directory "C:\development"): CreateProcess error=206, The filename or extension is too long
        at net.rubygrapefruit.platform.internal.DefaultProcessLauncher.start(DefaultProcessLauncher.java:25)
        ... 7 more
Caused by: java.io.IOException: CreateProcess error=206, The filename or extension is too long
        ... 8 more

我以前在Ant版本中看过这首歌和跳舞。这是因为类路径太长了。如果我可以自己明确定义类路径,则可以给它一个*.jar路径目录(未分解为单独的jar文件),它将起作用,缩短了类路径,但仍包含所有内容。但是,由于这里的classpathFileCollection,所以我看不到一种将通配符直接提供给未爆炸的类路径的方法。

也许我在DSL或FileCollections中缺少某些可以使我做到这一点的东西,但是没有人能想到解决此问题的好方法吗?

1 个答案:

答案 0 :(得分:0)

在这种情况下,看起来像pathing jar就足够了:

task pathingJar(type: Jar) {
    appendix = 'pathing'
    doFirst {
        manifest {
            attributes 'Class-Path': fileTree(dir: libPath, include: '*.jar').join(' ')
        }
    }
}

task cucumber(dependsOn: 'pathingJar') {
    doLast {
        ...
        javaexec {
            ...
            classpath = sourceSets.main.output +
                        sourceSets.test.output +
                        files(pathingJar.archivePath)
        }
    }
}