首页 > 解决方案 > 使用 Gradle 为 Gatling 构建可执行 Jar

问题描述

问题

我创建了一个 Scala 和 Gatling 项目,我想用它来执行一些负载测试。这个想法是我构建了一个可执行的 jar,然后我只需执行它来运行所述负载测试。

到目前为止,我在 IDE 中运行负载测试没有问题。但是,当我尝试将其组装时:

gradle assemble

jar 是空的,即包含我的实用程序类src/main/scala,但没有任何内容src/gatling/*(请参阅下面的设置)。

我已经尝试过使用胖罐子,但该任务给了我错误:

Execution failed for task ':fatJar'.
> Cannot expand ZIP 'D:\projects\load-test\build\classes\java\main' as it does not exist.

我不知道为什么它首先需要java。

我的设置

我的项目结构如下:

load-test/
├── src/
│   ├── gatling/
│   │   ├── resources
│   │   └── scala
│   ├── main/
│   │   ├── resources
│   │   └── scala
│   └── test/
│       ├── resources
│       └── scala
├── ...
└── build.gradle

我发现 Gatling 插件非常顽固,它只包含gatlingCompileClasspath. 所以为了能够编写负载测试,我需要有一个源集gatling。该main/scala目录用于实现一些实用功能,例如创建自定义时间戳等。test/scala测试这些。

build.gradle的如下:

plugins {
    id "com.github.maiflai.scalatest" version "0.25"
    id 'io.gatling.gradle' version "3.4.0"
    id "scala"
}

apply plugin: "scala"
apply plugin: "com.github.maiflai.scalatest"

compileScala.targetCompatibility = 1.8
ScalaCompileOptions.metaClass.useAnt = false

repositories {
    jcenter()
    maven {
        url "https://plugins.gradle.org/m2/"
    }
}

sourceSets {
    gatling {
        scala.srcDirs = ["src/gatling/scala"]
        resources.srcDirs = ["src/gatling/resources"]
    }

    test {
        scala.srcDirs = ["src/test/scala"]
        resources.srcDirs = ["src/test/resources"]
    }

}

dependencies {
    testCompile "gradle.plugin.com.github.maiflai:gradle-scalatest:0.25"
    testCompile "org.scala-lang:scala-library:2.12.12"
    testCompile 'org.scalatest:scalatest_2.12:3.0.0'
    testRuntime 'org.pegdown:pegdown:1.4.2'
}


gatling {
    toolVersion = '3.4.0'
    scalaVersion = '2.12.12'
    simulations = {
        include "**/*Simulation.scala"
    }
    systemProperties = ['file.encoding': 'UTF-8']
}


task fatJar(type: Jar) {
    manifest {
        attributes 'Implementation-Version': project.version,
                'Main-Class': 'io.gatling.app.Gatling'
    }
    setArchiveBaseName project.name + '-all'
    from { 
        configurations.gatlingRuntimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
    } {
        exclude 'META-INF/MANIFEST.MF'
        exclude 'META-INF/*.SF'
        exclude 'META-INF/*.DSA'
        exclude 'META-INF/*.RSA'

    }
    with jar
}

标签: scalagradlejargatling

解决方案


经过大量试验和数小时在文档中搜索提示后,这就是解决问题的构建 gradle 代码段:

configurations {
    fatJarDependencies.extendsFrom gatling
}

task fatJar(type: Jar, dependsOn: [':gatlingClasses', ':processResources']) {
    manifest {
        attributes 'Implementation-Title': 'Preparing test',
                'Implementation-Version': '',
                'Main-Class': 'io.gatling.app.Gatling'
    }
    classifier = 'all'
    from files(sourceSets.main.output.classesDirs)
    from files(sourceSets.gatling.output)
    from { configurations.fatJarDependencies.collect { it.isDirectory() ? it : zipTree(it) } } {
        exclude 'META-INF/MANIFEST.MF'
        exclude 'META-INF/*.SF'
        exclude 'META-INF/*.DSA'
        exclude 'META-INF/*.RSA'
    }
    with jar
}

关键如下:

1.配置

fatJarDependencies.extendsFrom gatling

您需要扩展gatling,因为在您的 fatJar 任务中类似configurations.gatlingRuntimeClasspath.collectconfigurations.gatling.collect不执行任何操作,即使存在这些配置(至少后者)。为了将依赖项放入您的 jar 中(gatling 本身、scala 和诸如此类),这是必要的。

2.依赖

准确地说:

(type: Jar, dependsOn: [':gatlingClasses', ':processResources'])

特别是gatlingClasses我通过扫描gatling gradle 插件的文档页面发现的。这会在下面添加代码src/gatling/*

我可以通过执行以下命令来运行模拟(-DConfig可选):

java -Dconfig.resource=myConf.conf -jar the-jar-i-created.jar -s org.comp.pckg.DemoSimulation

正如George Leung所指出的,如果您按照上面的方式开始评论,也可以在 jar 之外生成报告(我错误地忘记了我添加了 option -nr)。为了自定义文件夹,我添加了一个gatling.conf具有src/gatling/resources以下值的文件夹:

gatling {
  core {
    directory {
      results = "/gatling/reports"
    }
  }
}

这会覆盖您可以在此处找到的默认值。


推荐阅读