Фон
Я модифицирую Apache JMeter для использования в качестве автоматизированного инструмента для тестирования.
Исторически, у меня просто был отличный проект, который использовал gradle, и я брал артефакт jar этой сборки и помещал его в каталог jmeter/bin
.
Это позволило мне вызывать мой отличный код из сценариев jmeter.
Теперь я изменяю код JMeter, который запускает сценарии, чтобы выполнить какую-либо настраиваемую запись в журнал и передать некоторые настраиваемые привязки каждому сценарию.
Чтобы «упростить» весь этот процесс, я создал многопроектную сборку Gradle, структурированную так:
automation-package (root project)
|
|------- build.gradle
|------- settings.gradle
|
|-------- jmeter-app
| |
| |---- build.gradle
| |---- build.xml (JMeter is built with Ant)
| |---- build.properties (Ant build properties)
|
|-------- fakeblock-groovy (contains the classes that I want to use inside jmeter code)
|
|---- build.gradle
|---- src (Structured like a standard groovy gradle project)
|--- main
|--- test
Причиной использования этой структуры проекта является то, что я в конечном итоге добавлю больше подпроектов для обработки других вещей, но я готов изменить их, если я лаю не на том дереве
Содержимое скриптов сборки
- пакет автоматизации
//settings.gradle:
include ':jmeter-app'
include ':fakeblock-groovy'
//build.gradle:
plugins {
id 'idea'
id 'java'
}
allprojects {
apply plugin: 'java'
repositories {
mavenCentral()
}
}
project(':fakeblock-groovy') {
dependencies {
compile group: 'org.codehaus.groovy', name: 'groovy-dateutil', version: '2.5.5'
compile 'org.codehaus.groovy:groovy-all:2.5.5'
compile 'org.apache.commons:commons-text:1.6'
testCompile 'junit:junit:4.12'
testCompile 'org.jacoco:org.jacoco.ant:0.8.3'
}
}
project(':jmeter-app') {
dependencies {
implementation project(':fakeblock-groovy')
implementation fileTree(dir: 'lib', include: ['**/*.jar'])
}
}
- приложение jmeter
//build.gradle
apply plugin: 'idea'
apply plugin: 'java'
ant.importBuild('build.xml') { antTaskName ->
"ant-${antTaskName}".toString()
}
idea {
module {
sourceDirs += file("$projectDir/src/components")
sourceDirs += file("$projectDir/src/core")
sourceDirs += file("$projectDir/src/examples")
sourceDirs += file("$projectDir/src/functions")
sourceDirs += file("$projectDir/src/jorphan")
sourceDirs += file("$projectDir/src/junit")
sourceDirs += file("$projectDir/src/protocol")
sourceDirs += file("$projectDir/src/protocol/ftp")
sourceDirs += file("$projectDir/src/protocol/http")
sourceDirs += file("$projectDir/src/protocol/java")
sourceDirs += file("$projectDir/src/protocol/jdbc")
sourceDirs += file("$projectDir/src/protocol/jms")
sourceDirs += file("$projectDir/src/protocol/ldap")
sourceDirs += file("$projectDir/src/protocol/mail")
sourceDirs += file("$projectDir/src/protocol/mongodb")
sourceDirs += file("$projectDir/src/protocol/native")
sourceDirs += file("$projectDir/src/protocol/tcp")
}
}
sourceSets {
main {
java {
srcDirs = ['src']
}
}
}
repositories {
flatDir {
name = 'libs dir'
dir file('lib')
}
}
Проблема наблюдается
Если я запускаю gradle clean build
, тогда все работает без проблем, и кажется, что он делает jar до компиляции jmeter:
[...]
> Task :fakeblock-groovy:compileJava NO-SOURCE
> Task :fakeblock-groovy:compileGroovy
> Task :fakeblock-groovy:processResources NO-SOURCE
> Task :fakeblock-groovy:classes
> Task :fakeblock-groovy:jar
> Task :jmeter-app:compileJava
Processing annotations
Annotations processed
Processing annotations
No elements to process
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
[...]
Однако, когда я пытаюсь запустить jmeter gui через задачу gradle :jmeter-app:ant-run_gui
, сборка завершается неудачно, когда она пытается скомпилировать код с моим пользовательским классом:
> Task :jmeter-app:ant-compile-java FAILED
C:\Users\<username>\Desktop\automation-package\jmeter-app\src\protocol\java\org\apache\jmeter\protocol\java\sampler\JSR223Sampler.java:21: error: package com.fakeblock.logger does not exist
import com.fakeblock.logger.FakeblockLogger;
^
C:\Users\<username>\Desktop\automation-package\jmeter-app\src\protocol\java\org\apache\jmeter\protocol\java\sampler\JSR223Sampler.java:51: error: cannot find symbol
private static final FakeblockLogger fakeblockLogger = new FakeblockLogger();
^
symbol: class FakeblockLogger
location: class JSR223Sampler
2 errors
FAILURE: Build failed with an exception.
Я могу перейти к источнику для этого класса в IDE, поэтому я уверен, что gradle понимает вещи в основном .
Мое решение
Я могу заставить все работать правильно, если перестану использовать зависимости проекта gradle и вернусь к своей первой реализации, где я создаю задачи gradle для выполнения следующих действий:
1) Убедитесь, что фальшблок-шпунтовый кувшин построен
2) Получить версию jar из файла gradle.properties в подпроекте
3) Скопируйте файл jar в каталог jmeter-app / lib.
4) Добавьте / замените записи jmeter-app / build.properties правильной версией fakeblock-groovy.jar
Затем, если я вручную добавлю строку <include name="${lib.dir}/${fakeblock-groovy.jar}"/>
в набор шаблонов 'external.jars' внутри jmeter-app / build.xml, все будет работать правильно, и когда я запущу gradle :jmeter-app:ant-run_gui
, я вижу, что мои изменения делают то, что я в розыске. Когда я перехожу к источнику класса в IDE, он открывает декомпилированный источник java из jar-файла в jmeter-app / lib.
Мой вопрос
С моей установкой можно ли заставить работать простые зависимости проекта gradle или мне нужно объединить два моих подхода так, чтобы задача ant-run_gui
зависела от задач, обеспечивающих наличие jar внутри jmeter- Каталог app / lib и версия build.properties верны?