scala - 使用 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
}
解决方案
经过大量试验和数小时在文档中搜索提示后,这就是解决问题的构建 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.collect
或configurations.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"
}
}
}
这会覆盖您可以在此处找到的默认值。
推荐阅读
- r - 当给定“多边形”数据类型中的坐标时,如何在 R 中绘制纬度/经度六边形?
- javascript - 如何在angular2中重置RxJS不同
- javascript - 如何将内置 Javascript 函数编码为递归函数(使用全局变量)
- python - 如何将制表符扩展到空白并排列列给出表格格式?
- python - cpu-bound 线程是否总是在 Python 中重新获取 GIL?
- python - 无法使用“rm -rf ~/anaconda3”卸载 Anaconda
- ios - 从超级视图中删除视图崩溃
- javascript - 以模态显示 FlatListView,在滚动视图中工作
- c# - EPPlus 和 C#:如何在范围上应用条件格式而不是附加到每个单元格
- c# - 如何查看 TextBox.Text 是否是文本文件中的单词之一