Add Gradle build scripts

This commit is contained in:
Vladimir Sitnikov 2019-02-24 23:51:10 +03:00
parent 77c756c00f
commit 2be94e85da
78 changed files with 4735 additions and 532 deletions

18
.gitignore vendored
View File

@ -1,6 +1,16 @@
# Directory trees to ignore
/backups/
/build/
/buildSrc/build/
/buildSrc/subprojects/*/build/**
/buildSrc/subprojects/*/bin/**
/buildSrc/subprojects/*/out/**
/src/*/build/
/src/*/bin/
/src/*/out/
/src/protocol/*/build/
/src/protocol/*/bin/
/src/protocol/*/out/
/dist/
/docs/
/local/
@ -10,6 +20,14 @@
/target/
!/bin/report-template/**/dist
/bin/temp/
/bin/testfiles/testReport*
# Ignore Gradle project-specific cache directory
.gradle
# macOS
.DS_Store
# specific files to ignore
*.log

View File

@ -1,54 +1,38 @@
sudo: false
language: java
before_script:
- test "x$RUN_CHECKSTYLE" != 'x' || ant -Djava.awt.headless=true clean download_jars install
- test "x$RUN_CHECKSTYLE" != 'xtrue' || ant -Djava.awt.headless=true download_checkstyle
before_install:
- wget --no-check-certificate https://www.apache.org/dist/ant/binaries/apache-ant-1.10.5-bin.tar.gz
- tar -xzvf apache-ant-1.10.5-bin.tar.gz
- export PATH="$(pwd)/apache-ant-1.10.5/bin:$PATH"
- echo $(ant -version)
# skip default "install" command
install: true
before_cache:
- rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
- rm -fr $HOME/.gradle/caches/*/plugin-resolution/
cache:
directories:
- $HOME/.gradle/caches/
- $HOME/.gradle/wrapper/
env:
global:
- ANT_OPTS="-Ddisable-svnCheck=true -Djava.awt.headless=true -Drmi_force_localhost=true"
- GRADLE_ARGS="-Djava.awt.headless=true"
# Building source and binary distributions takes time, and it does not verify much, so we skip it in CI
- SKIP_DIST_TASKS="$GRADLE_ARGS -PskipDist"
matrix:
include:
- jdk: oraclejdk8
env: RUN_CHECKSTYLE=true
script: ant -Djava.awt.headless=true checkstyle
- name: Coverage on our default build with Oracle Java 8
jdk: oraclejdk8
script:
- ant coverage-travis
after_success:
- bash <(curl -s https://codecov.io/bash)
sudo: true # otherwise TEST_HTTPS.jmx -> analytics.usa.gov does not work
- name: Tests with OpenJDK 8
- name: Tests with OpenJDK 8 + code coverage
jdk: openjdk8
script:
- ant test
- ./gradlew $GRADLE_ARGS check createDist jacocoReport
after_success:
- bash <(curl -s https://codecov.io/bash)
- name: Tests with OpenJDK 11
jdk: openjdk11
script:
- ant test
sudo: true # otherwise TEST_HTTPS.jmx -> analytics.usa.gov does not work
- ./gradlew $SKIP_DIST_TASKS -PskipCheckstyle build createDist
- name: Tests with OpenJDK EA
jdk: openjdk-ea
script:
- ant test
sudo: true # otherwise TEST_HTTPS.jmx -> analytics.usa.gov does not work
- ./gradlew $SKIP_DIST_TASKS -PskipCheckstyle build createDist
allow_failures:
- jdk: openjdk-ea
# disable building with jdk9 as it has a bug and will not compile JMeter
# see https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8193802
# - jdk: oraclejdk9
# script: ant -Djava.awt.headless=true -Drmi_force_localhost=true -Dskip.bug52310=true test
# sudo: true # otherwise TEST_HTTPS.jmx -> analytics.usa.gov does not work

View File

@ -23,6 +23,41 @@ See:
* https://bz.apache.org/bugzilla/buglist.cgi?bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO&bug_severity=Blocker&bug_severity=Critical&bug_severity=Major&bug_severity=Normal&bug_severity=Regression&bug_severity=Minor&bug_severity=Trivial&product=JMeter&order=Bug%20Number&list_id=164231
* https://bz.apache.org/bugzilla/buglist.cgi?bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO&bug_severity=Enhancement&product=JMeter&order=Bug%20Number&list_id=164232
## Development setup
### Gradle
You might find useful Gradle commands in [gradle.md](gradle.md)
### <a name="intellij"></a>IntelliJ IDEA
You require IntelliJ 2018.3.1 or newer.
1. Open the build.gradle.kts file with IntelliJ IDEA and choose `Open as Project`
1. Make sure `Create separate module per source set` is selected
1. Make sure `Use default gradle wrapper` is selected
1. In the `File already exists` dialogue, choose `Yes` to overwrite
1. In the `Open Project` dialogue, choose `Delete Existing Project and Import`
### Eclipse
Eclipse can import Gradle projects automatically via `Import...->Gradle project` wizard.
Optionally you can generate Eclipse project by running
./gradlew eclipse
The steps to import the sources (based on Eclipse 2019-06) into Eclipse are as follows:
1. Install `Eclipse IDE for Java Developers`
1. Install the Groovy Eclipse plugin and select Groovy Compiler 2.4 (some tests are written in Groovy)
1. Install `Kotlin for Eclipse` plugin (builds scripts are written in Kotlin)
1. Make sure you have a Java 8 compatible JDK configured in your workspace
1. Open `File->Import...`
1. Select `Existing Gradle Project` and click `Next`
1. Read `How to experience the best Gradle integration` and click `Next`
1. Then you might just click `Finish`
## :star2: Have a patch?
The best way to make sure your issue or feature is addressed is to submit a patch.
We accept patches through:

112
LICENSE
View File

@ -176,115 +176,3 @@
END OF TERMS AND CONDITIONS
============================ End of Apache License V 2.0 ===================
Source and binary distributions of Apache JMeter contain:
- icons from the Open Icon Library http://openiconlibrary.sourceforge.net/
For license details, please see the file: licenses/src/openiconlibrary.txt
Additional source files (also included in binary distributions):
For details, please see the files under: licenses/src
* bootstrap-3.3.4.txt (MIT) | ./bin/report-template/sbadmin2-1.0.7/bower_components/bootstrap
* bootstrap-social.txt (MIT) | ./bin/report-template/sbadmin2-1.0.7/bower_components/bootstrap-social
* datatables-1.10.9.txt (MIT) | ./bin/report-template/sbadmin2-1.0.7/bower_components/datatables
* datatables-plugins.txt (MIT) | ./bin/report-template/sbadmin2-1.0.7/bower_components/datatables-plugins
* datatables-responsive-1.0.5.txt (MIT) | ./bin/report-template/sbadmin2-1.0.7/bower_components/datatables-responsive
* flot-0.8.3.txt (MIT) | ./bin/report-template/sbadmin2-1.0.7/bower_components/flot
* flot-axislabels.txt (MIT) | ./bin/report-template/sbadmin2-1.0.7/bower_components/flot-axislabels
* flot-tooltip-0.7.1.txt (MIT) | ./bin/report-template/sbadmin2-1.0.7/bower_components/flot.tooltip
* font-awesome-4.2.0.txt (OFL-1.1 | MIT) | ./bin/report-template/sbadmin2-1.0.7/bower_components/font-awesome
* holderjs.txt (MIT) | ./bin/report-template/sbadmin2-1.0.7/bower_components/holderjs
* jquery-2.1.3.txt (MIT | ./bin/report-template/sbadmin2-1.0.7/bower_components/jquery
* metisMenu-1.1.3.txt (MIT) | ./bin/report-template/sbadmin2-1.0.7/bower_components/metisMenu
* mocha-1.17.1.txt (MIT) | ./bin/report-template/sbadmin2-1.0.7/bower_components/mocha
* morrisjs-0.5.0.txt (Simplified BSD) | ./bin/report-template/sbadmin2-1.0.7/bower_components/morrisjs
* raphael-2.1.4.txt (MIT) | ./bin/report-template/sbadmin2-1.0.7/bower_components/raphael
* start-bootstrap-admin2-1.0.7.txt (Apache License V2.0) | ./bin/report-template/sbadmin2-1.0.7 and not in the above folders
Binary distributions additionally contain software included under various licenses,
see below.
The following software is provided under the Apache License V 2.0 (as above):
- Software produced at the ASF:
* apache-bsf-2.4.0.jar
* beanshell-2.0b6.jar
* cglib-nodep-3.2.9.jar
* commons-codec-1.11.jar
* commons-collections-3.2.2.jar
* commons-dbcp2-2.5.0.jar
* commons-io-2.6.jar
* commons-jexl2-2.1.1.jar
* commons-jexl3-3.1.jar
* commons-lang3-3.8.1.jar
* commons-math3-3.6.1.jar
* commons-net-3.6.jar
* commons-pool2-2.6.0.jar
* commons-text-1.6.jar
* dec-0.1.2.jar
* groovy-all-2.4.16.jar
* httpasyncclient-4.1.4.jar
* httpclient-4.5.8.jar
* httpcore-4.4.11.jar
* httpcore-nio-4.4.11.jar
* httpmime-4.5.8.jar
* jakarta-oro-2.0.8.jar
* jms-1.1.1.jar
* log4j-1.2-api-2.11.1.jar
* log4j-api-2.11.1.jar
* log4j-core-2.11.1.jar
* log4j-slf4j-impl-2.11.1.jar
* serializer-2.7.2.jar
* startbootstrap-sb-admin-2-1.0.7
* tika-core-1.21.jar
* tika-parsers-1.21.jar
* xalan-2.7.2.jar
* xerces-2.12.0.jar
* xml-apis-1.4.01.jar
* xmlgraphics-commons-2.3.jar
- Software produced outside the ASF which is available under AL 2.0:
* accessors-smart-1.2.jar
* caffeine-2.6.2.jar
* darcula.jar
* freemarker-2.3.28.jar (AL2.0, see licenses/bin for additional info)
* jackson-annotations-2.9.9.jar
* jackson-core-2.9.9.jar
* jackson-databind-2.9.9.jar
* json-path-2.4.0.jar
* json-smart-2.3.jar
* mongo-java-driver-2.11.3.jar
* objenesis-2.6.jar
* ph-commons-9.2.1.jar
* ph-css-6.1.1.jar
* spock-core-1.2-groovy-2.4.jar
- Software produced outside the ASF which is available under other licenses (not AL 2.0):
For details, please see the files under: licenses/bin
* asm-7.0.jar (BSD)
* dnsjava-2.1.8.jar (BSD)
* hamcrest-core-1.3.jar (BSD)
* javamail-1.5.0-b01.jar (CDDL Version 1.0)
* javax.activation-api-1.2.0.jar (CDDL Version 1.1)
* javax.activation-1.2.0.jar (CDDL Version 1.1)
* jcharts-0.7.5.jar (?)
* jcl-over-slf4j-1.7.25.jar (MIT)
* jsoup-1.11.3.jar (MIT)
* jodd-core-5.0.6.jar (Simplified BSD)
* jodd-lagarto-5.0.6.jar (Simplified BSD)
* jodd-log-5.0.6.jar (Simplified BSD)
* jodd-props-5.0.6.jar (Simplified BSD)
* jtidy-r938.jar (?)
* junit-4.12.jar (BSD)
* rhino-1.7.10.jar (MPL 2.0)
* rsyntaxtextarea-3.0.2.jar (BSD)
* slf4j-api-1.7.25.jar (MIT)
* xmlpull-1.1.3.1.jar (Public Domain)
* xpp3-1.1.4c.jar (Indiana University Extreme! Lab Software License 1.1.1)
* xstream-1.4.11.jar (BSD)
* hamcrest-date-2.0.4.jar (BSD)
* Saxon-HE-9.9.1-1.jar (Mozilla Public License version 2.0)

402
build.gradle.kts Normal file
View File

@ -0,0 +1,402 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
import com.github.spotbugs.SpotBugsPlugin
import com.github.spotbugs.SpotBugsTask
import com.github.vlsi.gradle.crlf.CrLfSpec
import com.github.vlsi.gradle.crlf.LineEndings
import com.github.vlsi.gradle.crlf.filter
import com.github.vlsi.gradle.git.FindGitAttributes
import com.github.vlsi.gradle.git.dsl.gitignore
import com.github.vlsi.gradle.release.RepositoryType
import org.ajoberstar.grgit.Grgit
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
plugins {
java
jacoco
checkstyle
id("org.jetbrains.gradle.plugin.idea-ext") version "0.5" apply false
id("org.nosphere.apache.rat") version "0.5.0"
id("com.github.spotbugs") version "1.6.10"
id("org.sonarqube") version "2.7.1"
id("com.github.vlsi.crlf") version "1.17.0"
id("com.github.vlsi.ide") version "1.17.0"
id("com.github.vlsi.stage-vote-release") version "1.17.0"
signing
publishing
}
ide {
copyrightToAsf()
ideaInstructionsUri =
uri("https://github.com/apache/jmeter/blob/master/CONTRIBUTING.md#intellij")
doNotDetectFrameworks("android", "jruby")
}
fun Project.boolProp(name: String) =
findProperty(name)
// Project properties include tasks, extensions, etc, and we want only String properties
// We don't want to use "task" as a boolean property
?.let { it as? String }
?.equals("false", ignoreCase = true)?.not()
// Release candidate index
val String.v: String get() = rootProject.extra["$this.version"] as String
version = "jmeter".v + releaseParams.snapshotSuffix
val displayVersion by extra {
version.toString() +
if (releaseParams.release.get()) {
""
} else {
// Append 7 characters of Git commit id for snapshot version
val grgit: Grgit? by project
grgit?.let { " " + it.head().abbreviatedId }
}
}
println("Building JMeter $version")
fun reportsForHumans() = !(System.getenv()["CI"]?.toBoolean() ?: false)
val lastEditYear by extra {
file("$rootDir/NOTICE")
.readLines()
.first { it.contains("Copyright") }
.let {
"""Copyright \d{4}-(\d{4})""".toRegex()
.find(it)?.groupValues?.get(1)
?: throw IllegalStateException("Unable to identify copyright year from $rootDir/NOTICE")
}
}
// This task scans the project for gitignore / gitattributes, and that is reused for building
// source/binary artifacts with the appropriate eol/executable file flags
// It enables to automatically exclude patterns from .gitignore
val gitProps by tasks.registering(FindGitAttributes::class) {
// Scanning for .gitignore and .gitattributes files in a task avoids doing that
// when distribution build is not required (e.g. code is just compiled)
root.set(rootDir)
}
val rat by tasks.getting(org.nosphere.apache.rat.RatTask::class) {
gitignore(gitProps)
// Note: patterns are in non-standard syntax for RAT, so we use exclude(..) instead of excludeFile
exclude(rootDir.resolve("rat-excludes.txt").readLines())
}
releaseParams {
tlp.set("JMeter")
releaseTag.set("v${project.version.toString().replace('.', '_')}")
rcTag.set(releaseTag.map { "${it}_RC" + rc.get() })
previewSiteContents {
into("rat")
from(rat)
}
svnDist {
// All the release versions are put under release/jmeter/{source,binary}
releaseFolder.set("release/jmeter")
releaseSubfolder.apply {
put(Regex("_src\\."), "sources")
put(Regex("."), "binaries")
}
}
nexus {
if (repositoryType.get() == RepositoryType.PROD) {
// org.apache.jmeter at repository.apache.org
stagingProfileId.set("4d29c092016673")
}
}
}
val jacocoReport by tasks.registering(JacocoReport::class) {
group = "Coverage reports"
description = "Generates an aggregate report from all subprojects"
}
val jacocoEnabled by extra {
(boolProp("coverage") ?: false) || gradle.startParameter.taskNames.any { it.contains("jacoco") }
}
// Do not enable spotbugs by default. Execute it only when -Pspotbugs is present
val enableSpotBugs by extra {
boolProp("spotbugs") ?: false
}
val skipCheckstyle by extra {
boolProp("skipCheckstyle") ?: false
}
// Allow to skip building source/binary distributions
val skipDist by extra {
boolProp("skipDist") ?: false
}
allprojects {
if (project.path != ":src") {
tasks.register<DependencyInsightReportTask>("allDependencyInsight") {
group = HelpTasksPlugin.HELP_GROUP
description =
"Shows insights where the dependency is used. For instance: allDependencyInsight --configuration compile --dependency org.jsoup:jsoup"
}
}
}
sonarqube {
properties {
// See https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner+for+Gradle#AnalyzingwithSonarQubeScannerforGradle-Configureanalysisproperties
property("sonar.sourceEncoding", "UTF-8")
val projectName = "JMeter"
property("sonar.projectName", projectName)
property("sonar.projectKey", "org.apache.jmeter:$projectName")
property("sonar.projectVersion", project.version.toString())
property("sonar.host.url", System.getenv()["SONAR_HOST_URL"] ?: "http://localhost:9000")
property("sonar.login", System.getenv()["SONAR_LOGIN"] ?: "")
property("sonar.password", System.getenv()["SONAR_PASSWORD"] ?: "")
property("sonar.links.homepage", "https://jmeter.apache.org")
property("sonar.links.ci", "https://builds.apache.org/job/JMeter-trunk/")
property("sonar.links.scm", "https://jmeter.apache.org/svnindex.html")
property("sonar.links.issue", "https://jmeter.apache.org/issues.html")
}
}
allprojects {
group = "org.apache.jmeter"
// JMeter ClassFinder parses "class.path" and tries to find jar names there,
// so we should produce jars without versions names for now
// version = rootProject.version
plugins.withType<JavaPlugin> {
// We don't intend to resolve that configuration
// It is in line with further Gradle versions: https://github.com/gradle/gradle/issues/8585
dependencies {
configurations {
compileOnly(platform(project(":src:bom")))
}
}
apply<IdeaPlugin>()
apply<EclipsePlugin>()
if (!skipCheckstyle) {
apply<CheckstylePlugin>()
checkstyle {
toolVersion = "checkstyle".v
}
}
apply<SpotBugsPlugin>()
spotbugs {
toolVersion = "spotbugs".v
}
}
plugins.withType<JacocoPlugin> {
the<JacocoPluginExtension>().toolVersion = "jacoco".v
val testTasks = tasks.withType<Test>()
val javaExecTasks = tasks.withType<JavaExec>()
// This configuration must be postponed since JacocoTaskExtension might be added inside
// configure block of a task (== before this code is run). See :src:dist-check:createBatchTask
afterEvaluate {
for (t in arrayOf(testTasks, javaExecTasks)) {
t.configureEach {
extensions.findByType<JacocoTaskExtension>()?.apply {
// Do not collect coverage when not asked (e.g. via jacocoReport or -Pcoverage)
isEnabled = jacocoEnabled
// We don't want to collect coverage for third-party classes
includes?.add("org.apache.jmeter.*")
includes?.add("org.apache.jorphan.*")
includes?.add("org.apache.commons.cli.*")
}
}
}
}
jacocoReport {
// Note: this creates a lazy collection
// Some of the projects might fail to create a file (e.g. no tests or no coverage),
// So we check for file existence. Otherwise JacocoMerge would fail
val execFiles =
files(testTasks, javaExecTasks).filter { it.exists() && it.name.endsWith(".exec") }
executionData(execFiles)
}
tasks.withType<JacocoReport>().configureEach {
reports {
html.isEnabled = reportsForHumans()
xml.isEnabled = !reportsForHumans()
}
}
// Add each project to combined report
configure<SourceSetContainer> {
val mainCode = main.get()
jacocoReport.configure {
additionalSourceDirs.from(mainCode.allJava.srcDirs)
sourceDirectories.from(mainCode.allSource.srcDirs)
// IllegalStateException: Can't add different class with same name: module-info
// https://github.com/jacoco/jacoco/issues/858
classDirectories.from(mainCode.output.asFileTree.matching {
exclude("module-info.class")
})
}
}
}
tasks.withType<AbstractArchiveTask>().configureEach {
// Ensure builds are reproducible
isPreserveFileTimestamps = false
isReproducibleFileOrder = true
dirMode = "775".toInt(8)
fileMode = "664".toInt(8)
}
// Not all the modules use publishing plugin
plugins.withType<PublishingPlugin> {
apply<SigningPlugin>()
// Sign all the published artifacts
signing {
sign(publishing.publications)
}
}
plugins.withType<SigningPlugin> {
afterEvaluate {
configure<SigningExtension> {
val release = rootProject.releaseParams.release.get()
// Note it would still try to sign the artifacts,
// however it would fail only when signing a RELEASE version fails
isRequired = release
}
}
}
plugins.withType<JavaPlugin> {
// This block is executed right after `java` plugin is added to a project
repositories {
jcenter()
ivy {
url = uri("https://github.com/bulenkov/Darcula/raw/")
content {
includeModule("com.github.bulenkov.darcula", "darcula")
}
patternLayout {
artifact("[revision]/build/[module].[ext]")
}
metadataSources {
artifact() // == don't try downloading .pom file from the repository
}
}
}
tasks {
withType<JavaCompile>().configureEach {
options.encoding = "UTF-8"
}
withType<ProcessResources>().configureEach {
from(source) {
include("**/*.properties")
filteringCharset = "UTF-8"
// apply native2ascii conversion since Java 8 expects properties to have ascii symbols only
filter(org.apache.tools.ant.filters.EscapeUnicode::class)
filter(LineEndings.LF)
}
// Text-like resources are normalized to LF (just for consistency purposes)
// This makes to produce exactly the same jar files no matter which OS is used for the build
from(source) {
include("**/*.dtd")
include("**/*.svg")
include("**/*.txt")
// Test resources have files in CP1252, and we don't want to parse them as UTF-8
exclude("**/*cp1252*")
filteringCharset = "UTF-8"
filter(LineEndings.LF)
}
}
afterEvaluate {
// Add default license/notice when missing (e.g. see :src:config that overrides LICENSE)
withType<Jar>().configureEach {
CrLfSpec(LineEndings.LF).run {
into("META-INF") {
filteringCharset = "UTF-8"
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
// Note: we need "generic Apache-2.0" text without third-party items
// So we use the text from $rootDir/config/ since source distribution
// contains altered text at $rootDir/LICENSE
textFrom("$rootDir/config/LICENSE")
textFrom("$rootDir/NOTICE")
}
}
}
}
withType<Jar>().configureEach {
manifest {
attributes["Bundle-License"] = "Apache-2.0"
attributes["Specification-Title"] = "Apache JMeter"
attributes["Specification-Vendor"] = "Apache Software Foundation"
attributes["Implementation-Vendor"] = "Apache Software Foundation"
attributes["Implementation-Vendor-Id"] = "org.apache"
attributes["Implementation-Version"] = rootProject.version
}
}
withType<Test>().configureEach {
testLogging {
exceptionFormat = TestExceptionFormat.FULL
}
// Pass the property to tests
systemProperty("java.awt.headless", System.getProperty("java.awt.headless"))
}
withType<SpotBugsTask>().configureEach {
group = LifecycleBasePlugin.VERIFICATION_GROUP
if (enableSpotBugs) {
description = "$description (skipped by default, to enable it add -Dspotbugs)"
}
reports {
html.isEnabled = reportsForHumans()
xml.isEnabled = !reportsForHumans()
}
enabled = enableSpotBugs
}
withType<Javadoc>().configureEach {
(options as StandardJavadocDocletOptions).apply {
noTimestamp.value = true
showFromProtected()
docEncoding = "UTF-8"
charSet = "UTF-8"
encoding = "UTF-8"
docTitle = "Apache JMeter ${project.name} API"
windowTitle = "Apache JMeter ${project.name} API"
header = "<b>Apache JMeter</b>"
bottom =
"Copyright © 1998-$lastEditYear Apache Software Foundation. All Rights Reserved."
if (JavaVersion.current() >= JavaVersion.VERSION_1_9) {
addBooleanOption("html5", true)
links("https://docs.oracle.com/javase/9/docs/api/")
} else {
links("https://docs.oracle.com/javase/8/docs/api/")
}
}
}
}
configure<JavaPluginConvention> {
sourceCompatibility = JavaVersion.VERSION_1_8
}
}
}

61
buildSrc/build.gradle.kts Normal file
View File

@ -0,0 +1,61 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
plugins {
java
`kotlin-dsl` apply false
}
repositories {
jcenter()
gradlePluginPortal()
}
allprojects {
repositories {
jcenter()
gradlePluginPortal()
}
applyKotlinProjectConventions()
}
fun Project.applyKotlinProjectConventions() {
apply(plugin = "org.gradle.kotlin.kotlin-dsl")
plugins.withType<KotlinDslPlugin> {
configure<KotlinDslPluginOptions> {
experimentalWarning.set(false)
}
}
tasks.withType<KotlinCompile> {
sourceCompatibility = "unused"
targetCompatibility = "unused"
kotlinOptions {
jvmTarget = "1.8"
}
}
}
dependencies {
subprojects.forEach {
runtimeOnly(project(it.path))
}
}

View File

@ -0,0 +1,49 @@
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
com.googlecode.javaewah/JavaEWAH/1.1.6=FEA689D1E29761CE90C860EE3650C4167AE9E5ECAA316247BDAFAC5833BCE48D2B3E04E633B426E3AB7EF3A5C9C7FD150FFA0C21AFDCAE9C945CB2BB85F8A82F
com.jcraft/jsch/0.1.54=97EC6DE64F4870EE3C84F883BD3664562BFD600CA9F3364966E7DBEE7E4E8520647C03F9F81D6808E330052CA1333E37F497D6252CD26FE721A90F573CBE2036
com.jcraft/jzlib/1.1.1=223AF0806A19FD25E2496C980B9824B7612528013EAB9E7E21161ACFE81A6F808D3D65148BDAA794C9AB73C518F6B49AA7A69107C9BC0D66D6F8E78C39964F8F
org.ajoberstar.grgit/grgit-core/3.1.1=B856459DBAD417987ED640ECCD77DEE8E16589B75741BE4E985A028BC1ECEE71D1E3FE75E2BDDFB5342D54D497C41F9368F99C5FD77892C4A48E46EA37E114C8
org.ajoberstar.grgit/grgit-gradle/3.1.1=B168B7249D83A2C156BD7C3F59E1DCA79ABEB3AB9F32AB548C3A429814FA5095E678839EB269DF332D0F003A7CAFAF3D69E07C0B8B123A4A8EA2F32C56A6C608
org.bouncycastle/bcpg-jdk15on/1.60=8CB407B096C218152D427CAFE1DE55CA7E77555D688492F84477678CDB6B0DF14DD7BC3C64B7B93FEDBB52EDB1384CC97EF96A9D87162C8997C8DC49D538E565
org.bouncycastle/bcpkix-jdk15on/1.60=D44CDAC998A0D804AC452725C9E84B7D517C838CC6770CECDB214E1DF50EFC5EC2D067A91A5009F1316A5635CF7A1D213F2EE2A4E7497C66E1C7BBD5D2D4445F
org.bouncycastle/bcprov-jdk15on/1.60=1C08D82349E333720C08FC467FF6489B14B8633A09019BF8BB5E6A3C426DFAE6DCC415648FE1FB4A2DA8631548F4947AB6CA1BC90B3190A05040F4D2EB271A10
org.eclipse.jgit/org.eclipse.jgit/5.3.0.201903130848-r=75C66DB40AB4D7C0765666E1F65633E6AC07A94898F9120BC132DAAEFB143866385CE3538CA0383AF4BABB70C1F69A387D737C60B6006D24FD2A8E177C8E127D
org.gradle.kotlin/plugins/1.2.8=8EA1B7517CCCC6DD1A41CF0E88613F14548AF9052A0A8E1C68004F3B58A1D26B47A8BDA2D9F663213F59FCDBCEC4BE1A596D8B0B50013C7DD0276140D9DE3391
org.jetbrains.intellij.deps/trove4j/1.0.20181211=1C805EFE0DD5700941D20F02D6BA8DD79C54BFFE3B0147D82AF9B7525DBDCC97EEE5B3258CBCE161A39A699C28574BA43BA401DBF3AD3D73600293146949D512
org.jetbrains.kotlin/kotlin-android-extensions/1.3.31=4F12351F0D5C76A0A2AC632900011796E3407A3EC1BB47E292C9AB1A7860FFDBE97CB0148E01FF8B48F9DC2FBE4ECDEBD2E534FCBFC11887A8844CA4E15969D4
org.jetbrains.kotlin/kotlin-annotation-processing-gradle/1.3.31=B6111418E8AAAC28E431EE50B25E08A79C2A687B909A059266AFF294EB00BCC631194BBA6EB2658725A5D42D1C393BC1236933F35AF7988F51845B02239E0F39
org.jetbrains.kotlin/kotlin-build-common/1.3.31=D4FD475E78AF3B9D6802EE5E02996C37415D2EBAD50ACDE4C08F59EB7377ECE02ECC233D24FBFAE5BC7ACFD9E0C224E3AC59629BF62EF0B8C85C13F41E033172
org.jetbrains.kotlin/kotlin-compiler-embeddable/1.3.31=9A02D07901B60508DBDA0EAC4B77EB0277EB2C2A9D5D12214D70033BD5DD998D93FF55CBC8E2AF9DD76DC98C6C93FA782BA9754A089878111BAE95540ABCB631
org.jetbrains.kotlin/kotlin-compiler-runner/1.3.31=E1F54D04A06375F8C63752048D465FBC541FAAE1C566E4CB69AAC15D72BE99A2326C6E6FA7FEBB52D99140D057C276413F33CCB693ADED4322B2F0C47B0A3AD8
org.jetbrains.kotlin/kotlin-daemon-client/1.3.31=C11140F18A4740F81B2CA3A6A91FCD64FCDBAD6FE9EBA4A936D12FEA063D46700CBB3410CC103856D36D7A477071284CF0C57A829D34EC84C0E03EDE61714FCD
org.jetbrains.kotlin/kotlin-gradle-plugin-api/1.3.31=5FD21B25A8392863996555F5F79ABBD3FACE12B7DABC8D9254E00B6ECA490F9FD39921F70C440D177025C4B5BDA171B815F2E2D4C0397D0A9B4E1400FF2D0A58
org.jetbrains.kotlin/kotlin-gradle-plugin-model/1.3.31=253FCF64208F43F0B0C23853D4008E54F220F03505EAE78EEA9D638AC366D6AF7DE4988DF3CB64C327B22AEA643E275C9C4829C61226F756B686E59D2AA6ED51
org.jetbrains.kotlin/kotlin-gradle-plugin/1.3.31=DEB2B99A9B8A03E867CF13AF0FC0FBAF383079D756B8CE71F3FDA0C7C56B4F175E2628A987F26A9F08F5C45855F0B0897E906F324D1F7629D3479F0172AAFA31
org.jetbrains.kotlin/kotlin-native-utils/1.3.31=7C48BC3942597D5D0A9697E6F788C6F1F11BF8CD9EC7EA24B96DEFD8360B932E6CF1673FA518909F1107A1FFEB52BA02F150890E54FB5C056132E4267F0B7133
org.jetbrains.kotlin/kotlin-reflect/1.3.31=E8229A254AF9FC0BD0D0D7FADD5F7D9F3C66A5A1B67E899A287DAAB84ED1A1B8C42E9107A4E9AD8571E05744DBBC44A3129FD2ECD0565B0E476A6E64115935C8
org.jetbrains.kotlin/kotlin-sam-with-receiver/1.3.31=856D9098AAB66CC8611D56566E9E0691C3AA3463F24311FFEED492C8FB34FF6EE6A314F5BCE3A2F5662AA3BC4453A0412E3ECCE68C23CBD812BA0010AA68949B
org.jetbrains.kotlin/kotlin-script-runtime/1.3.31=89D1F00F20E6ED727C6161B6E0AB32D65705D07E21C75D181FDFD39DD40069DB9710FC831C9F4CF50DE3B4C96A8C9DDB5CE5A9DCCA094B81BE58D098D7D84217
org.jetbrains.kotlin/kotlin-scripting-compiler-embeddable/1.3.31=3B27F42E75702DE44CB6CCC4E64D74CB801A406208311F2F2CC0E3022BE9BD4AC12F6C211DDB730E92746A6F57F96E232B4582B6EF1577795D3E749C74CED0EF
org.jetbrains.kotlin/kotlin-stdlib-common/1.3.31=53DF3352743FF6756CA8A5A63EE04DE27B9FA873204F89823C4906CFE33BC5FA91899B35B6EDADF852F7DB2C300D56FCB2D32AE4606EFBA4E3BFF32BEED5531
org.jetbrains.kotlin/kotlin-stdlib-jdk7/1.3.31=9500F884AA93069DD0DCBBA231CE7CAD76BD9B71B2FA51573842AA9B730192A13B813402DF9DBC6956B7BB35ACC23072FBF04A93E0A98002500FBBE35E8894E5
org.jetbrains.kotlin/kotlin-stdlib-jdk8/1.3.31=16FE610D51CB610DBF1B1AAC490E159559F5172B29A04288AD18E95B68F462BE1A386B3F3B0D93AD4F7F3A1E5CD9498855571D9A24A0F5F6AD7D6FF20FFDDFD0
org.jetbrains.kotlin/kotlin-stdlib/1.3.31=1DE7F0A1E0920D179DD3677D78B8D4AB009F04FED8919584A4190D4B69C2D4754454613A91BD41A66DA45E48F9E23B6AC5BFFF0B409F81BE1746556298AD698A
org.jetbrains/annotations/13.0=5622D0FFE410E7272E2BB9FAE1006CAEDEB86D0C62D2D9F3929A3B3CDCDEF1963218FCF0CEDE82E95EF9F4DA3ED4A173FA055EE6E4038886376181E0423E02FF
org.slf4j/slf4j-api/1.7.2=BFE12C722ED57FAA3E26FEF214D95B9BDD2192742901920954979926D51E7B1BF0F61EA538F858328F4D6A306AFFECDCEF9D52452530CD2FE5C03552350C0EA0

View File

@ -0,0 +1,17 @@
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
org.gradle.parallel=true
kotlin.code.style=official
kotlin.parallel.tasks.in.project=true

View File

@ -0,0 +1,74 @@
import org.gradle.api.internal.artifacts.result.DefaultResolvedDependencyResult
import java.security.MessageDigest
import java.util.*
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
include("batchtest")
val upperCaseLetters = "\\p{Upper}".toRegex()
fun String.toKebabCase() =
replace(upperCaseLetters) { "-${it.value.toLowerCase()}" }
fun buildFileNameFor(projectDirName: String) =
"$projectDirName.gradle.kts"
for (project in rootProject.children) {
val projectDirName = project.name.toKebabCase()
project.projectDir = file("subprojects/$projectDirName")
project.buildFileName = buildFileNameFor(projectDirName)
assert(project.projectDir.isDirectory)
assert(project.buildFile.isFile)
}
buildscript {
dependencies {
classpath("com.github.vlsi.gradle:checksum-dependency-plugin:1.19.0")
}
repositories {
gradlePluginPortal()
}
}
// Note: we need to verify the checksum for checksum-dependency-plugin itself
val expectedSha512 =
"D7B1A0C7937DCB11536F97C52FE25752BD7DA6011299E81FA59AD446A843265A6FA079ECA1D5FD49C4B3C2496A363C60C5939268BED0B722EFB8BB6787A2B193"
fun File.sha512(): String {
val md = java.security.MessageDigest.getInstance("SHA-512")
forEachBlock { buffer, bytesRead ->
md.update(buffer, 0, bytesRead)
}
return BigInteger(1, md.digest()).toString(16).toUpperCase()
}
//
val checksumDependencyJar: File = buildscript.configurations["classpath"].resolve().first()
val actualSha512 = checksumDependencyJar.sha512()
if (actualSha512 != expectedSha512) {
throw GradleException(
"""
Checksum mismatch for $checksumDependencyJar
Expected: $expectedSha512
Actual: $actualSha512
""".trimIndent()
)
}
apply(plugin = "com.github.vlsi.checksum-dependency")

View File

@ -0,0 +1,30 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
dependencies {
compile("org.ajoberstar.grgit:grgit-gradle:3.1.1")
}
gradlePlugin {
plugins {
register("batchtest") {
id = "jmeterbuild.batchtest"
implementationClass = "org.apache.jmeter.buildtools.batchtest.BatchtestPlugin"
}
}
}

View File

@ -0,0 +1,207 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.jmeter.buildtools.batchtest
import org.eclipse.jgit.diff.DiffAlgorithm
import org.eclipse.jgit.diff.DiffFormatter
import org.eclipse.jgit.diff.RawText
import org.eclipse.jgit.diff.RawTextComparator
import org.gradle.api.GradleException
import org.gradle.api.model.ObjectFactory
import org.gradle.api.tasks.*
import org.gradle.kotlin.dsl.configure
import org.gradle.kotlin.dsl.property
import java.io.File
import java.net.InetAddress
import javax.inject.Inject
open class BatchTest @Inject constructor(objects: ObjectFactory) : JavaExec() {
companion object {
const val BATCH_TESTS_GROUP_NAME = "Batch test"
}
@Input
val ignoreErrorLogs = objects.property<Boolean>().convention(false)
@Input
val testName = objects.property<String>()
@InputDirectory
val inputDirectory = objects.directoryProperty().convention(
project.rootProject.layout.projectDirectory.dir("bin/testfiles")
)
@InputFile
val batchProperties = objects.fileProperty().convention(
project.rootProject.layout.projectDirectory.file("bin/testfiles/jmeter-batch.properties")
)
@InputFile
val log4jXml = objects.fileProperty().convention(
project.rootProject.layout.projectDirectory.file("bin/testfiles/log4j2-batch.xml")
)
@Input
val userLanguage = objects.property<String>().convention("en")
@Input
val userRegion = objects.property<String>().convention("en")
@Input
val userCountry = objects.property<String>().convention("US")
@InputFile
val jmx = objects.fileProperty()
.convention(inputDirectory.file(testName.map { "$it.jmx" }))
@Internal
val outputDirectory = objects.directoryProperty()
.convention(project.rootProject.layout.projectDirectory.dir("bin"))
@Internal
val logFile = objects.fileProperty()
.convention(outputDirectory.file(testName.map { "$it.log" }))
@Internal
val jtlFile = objects.fileProperty()
.convention(outputDirectory.file(testName.map { "$it.jtl" }))
@Internal
val csvFile = objects.fileProperty()
.convention(outputDirectory.file(testName.map { "$it.csv" }))
@Internal
val xmlFile = objects.fileProperty()
.convention(outputDirectory.file(testName.map { "$it.xml" }))
@Internal
val errFile = objects.fileProperty()
.convention(outputDirectory.file(testName.map { "$it.err" }))
// Re-run the task when jar contents is changed
@get:InputFiles
val jars
get() = project.rootProject.layout.projectDirectory.dir("lib").asFileTree
@get:InputFile
val jmeterJar
get() = project.rootProject.layout.projectDirectory.dir("bin").file("ApacheJMeter.jar")
init {
group = BATCH_TESTS_GROUP_NAME
description = "Runs jmx file via process fork and verifies outputs"
configure {
workingDir = File(project.rootDir, "bin")
main = "org.apache.jmeter.NewDriver"
classpath(jmeterJar)
// This does not depend on the task configuration, so the properties are initialized early
// It enables to override the properties later (e.g. in the build script)
maxHeapSize = "128m"
jvmArgs("-Xss256k", "-XX:MaxMetaspaceSize=128m")
systemProperty("java.rmi.server.hostname", InetAddress.getLocalHost().canonicalHostName)
systemProperty("java.awt.headless", "true")
}
}
fun jmeterArgument(name: String, value: String) {
args("-J$name=$value")
}
private fun deleteWorkfiles() {
project.delete(csvFile, xmlFile, logFile, jtlFile, errFile)
}
fun compareFiles(summary: MutableList<String>, actualFile: File): Boolean {
val actual = actualFile.readText()
val fileName = actualFile.name
val expectedFile = inputDirectory.file(fileName).get().asFile
val expected = expectedFile.readText()
if (expected == actual) {
return true
}
summary.add("unexpected output $fileName")
println("ERROR: unexpected output for $fileName:")
println(" - expected ${expectedFile.length()} bytes, $expectedFile")
println(" + actual ${actualFile.length()} bytes, $actualFile")
val e = RawText(expectedFile)
val a = RawText(actualFile)
val diffAlgorithm = DiffAlgorithm.getAlgorithm(DiffAlgorithm.SupportedAlgorithm.HISTOGRAM)
val edits = diffAlgorithm.diff(RawTextComparator.DEFAULT, e, a)
DiffFormatter(System.out).format(edits, e, a)
return false;
}
override fun exec() {
systemProperty("user.language", userLanguage.get())
systemProperty("user.region", userRegion.get())
systemProperty("user.country", userCountry.get())
args("-pjmeter.properties")
args("-q", batchProperties.get())
args("-n")
args("-t", jmx.get())
args("-i", log4jXml.get())
args("-j", logFile.get())
args("-l", jtlFile.get())
// Check properties can be passed to local/remote tests
args("-Jmodule=Module")
args("-Gmodule=Module")
// Check property can be used for filenames in local/remote tests (no need to defined as -G)
args("-JCSVFILE=${csvFile.get()}")
deleteWorkfiles()
super.exec()
val summary = mutableListOf<String>()
checkErrors(summary)
if (summary.isNotEmpty()) {
throw GradleException("Failures detected while testing ${jmx.get()}: $summary")
}
deleteWorkfiles()
}
protected open fun checkErrors(summary: MutableList<String>) {
compareFiles(summary, csvFile.get().asFile)
compareFiles(summary, xmlFile.get().asFile)
val log = logFile.get().asFile
catLogFile(log, summary, ignoreErrorLogs.get())
}
protected fun catLogFile(
log: File,
summary: MutableList<String>,
ignoreErrors: Boolean = false
) {
if (log.length() == 0L) {
println("No errors present in the logfile $log (the file is empty)")
return
}
if (ignoreErrors) {
println("WARNING: the task was configured to ignore errors in the output log")
} else {
summary.add("errors in ${log.name}")
}
println("Logfile contents (errors during the test, see $log):")
log.inputStream().use { it.copyTo(System.out) }
}
}

View File

@ -0,0 +1,142 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.jmeter.buildtools.batchtest
import org.gradle.api.GradleException
import org.gradle.api.model.ObjectFactory
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.OutputFile
import org.gradle.kotlin.dsl.findByType
import org.gradle.testing.jacoco.plugins.JacocoTaskExtension
import java.io.File
import java.net.ConnectException
import java.net.InetAddress
import java.net.ServerSocket
import java.net.Socket
import java.time.Duration
import java.util.concurrent.Executors
import java.util.concurrent.TimeUnit
import java.util.concurrent.TimeoutException
import javax.inject.Inject
open class BatchTestServer @Inject constructor(objects: ObjectFactory) : BatchTest(objects) {
private val executor =
Executors.newFixedThreadPool(project.gradle.startParameter.maxWorkerCount)
@Internal
val serverLogFile = objects.fileProperty()
.convention(outputDirectory.file(testName.map { "${it}Server.log" }))
@OutputFile
val jacocoExecFile = objects.fileProperty()
.convention(project.layout.buildDirectory.file("jacoco/$name.exec"))
private fun deleteWorkfiles() {
project.delete(serverLogFile)
}
private fun getFreePort(): Int =
ServerSocket(0).use {
return it.localPort
}
private fun waitForPort(host: String, port: Int, timeout: Duration): Boolean {
val deadline = System.nanoTime() + timeout.toNanos()
while (System.nanoTime() < deadline) {
try {
Socket(host, port).close()
return true
} catch (e: ConnectException) {
/* ignore */
Thread.sleep(50)
}
}
throw GradleException("Unable to connect to $host:$port with timeout of $timeout")
}
override fun checkErrors(summary: MutableList<String>) {
super.checkErrors(summary)
catLogFile(serverLogFile.get().asFile, summary)
}
override fun exec() {
deleteWorkfiles()
val client = this
val serverPort = getFreePort()
val serverHost = InetAddress.getLocalHost().canonicalHostName
args("-R$serverHost:$serverPort")
val jacoco = extensions.findByType<JacocoTaskExtension>()
// The extension might not exist, so don't fail if so
// When the extension is present, we get javaagent argumet from it
val jvmarg = jacoco?.takeIf { it.isEnabled }?.let {
val dst = it.destinationFile ?: throw GradleException("destinationFile is not configured for task $this")
val serverExec = jacocoExecFile.get().asFile
it.setDestinationFile(serverExec)
if (serverExec.exists()) {
// We want to capture new coverage, not a merged result from previous runs
// so previous .exec should be deleted if exists
serverExec.delete()
}
val jvmarg = it.asJvmArg
it.setDestinationFile(dst)
jvmarg
}
val server = executor.submit {
project.javaexec {
workingDir = File(project.rootDir, "bin")
main = "org.apache.jmeter.NewDriver"
classpath(client.classpath)
standardOutput = System.out.writer().withPrefix("[server] ")
errorOutput = System.err.writer().withPrefix("[server] ")
maxHeapSize = client.maxHeapSize
jvmArgs("-Xss256k", "-XX:MaxMetaspaceSize=128m")
if (jvmarg != null) {
jvmArgs(jvmarg)
}
systemProperty("java.rmi.server.hostname", serverHost)
systemProperty("server_port", serverPort)
systemProperty("java.awt.headless", "true")
systemProperty("user.language", userLanguage.get())
systemProperty("user.region", userRegion.get())
systemProperty("user.country", userCountry.get())
args("-pjmeter.properties")
args("-q", batchProperties.get())
args("-i", log4jXml.get())
args("-j", serverLogFile.get())
args("-s", "-Jserver.exitaftertest=true")
}
.rethrowFailure()
.assertNormalExitValue()
}
waitForPort(serverHost, serverPort, Duration.ofSeconds(5))
super.exec()
try {
server.get(1, TimeUnit.SECONDS)
} catch (e: TimeoutException) {
server.cancel(true)
}
deleteWorkfiles()
}
}

View File

@ -0,0 +1,27 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.jmeter.buildtools.batchtest
import org.gradle.api.Plugin
import org.gradle.api.Project
open class BatchtestPlugin: Plugin<Project> {
override fun apply(target: Project) {
}
}

View File

@ -0,0 +1,38 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.jmeter.buildtools.batchtest
import org.gradle.internal.io.LineBufferingOutputStream
import org.gradle.internal.io.TextStream
import java.io.Writer
fun Writer.withPrefix(prefix: String) =
LineBufferingOutputStream(object : TextStream {
override fun text(text: String?) {
write(prefix)
write(text)
flush()
}
override fun endOfStream(failure: Throwable?) {
if (failure != null) {
throw failure
}
}
})

204
checksum.properties Normal file
View File

@ -0,0 +1,204 @@
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
antlr/antlr/2.7.7=311C3115F9F6651D1711C52D1739E25A70F25456CACB9A2CDDE7627498C30B13D721133CC75B39462AD18812A82472EF1B3B9D64FAB5ABB0377C12BF82043A74
bsf/bsf/2.4.0=CF2FF6EA53CD13EA842CAD398F1BE24539BEC68A5CBBD088492ADAB50BC782CDE6D9F4C0B6A24DEAEEE537809C90631C43F9A680FF2826C28CCF1B39380954E3
cglib/cglib-nodep/3.2.9=429F5E63C33F3E65615243AD24C27C86FD1ADE3C5DAA0A64F9FAF8BCE1E59ED9A6D4EDC348281CBB8FD7AE10C01FC2E3716FF74571B14A31A37DDE1DE06E2A3A
com.fasterxml.jackson.core/jackson-annotations/2.9.9=FD7E441FBB6A807B1841497BBF6B4950CA11A48FAD19B83BAD6DA691A9878A8B03F28EEF11DAC7EF160CB9535C999D7BBF49DA155C165C205AEB7DD81C111F28
com.fasterxml.jackson.core/jackson-core/2.9.9=D8BEAC9E71444BC795C9D99308EAD3284A39AA161F825708DA7DBDFCE410D099C0BBC76C31C27ADAD540CF3BCCF6826D539FCB157923EFAE84B10B3778B920A9
com.fasterxml.jackson.core/jackson-databind/2.9.9=47204158C4ADBBC8D6659055786641EF6EC95EF6648662AD797AFACE0A3E1074C7BD4D2F565BBE5837BFD0BC06AEC2D8888415FF94A94583F5BDA644CA5004A5
com.fifesoft/rsyntaxtextarea/3.0.2=A210EC77304E7B0B175532BD7E5C2A46823C0D93B359E174782B548087B48A0386D3CAE566877ACFB6252E6B4F28C25DAA6B8074A55BC54A296FC4AC554B0DC1
com.github.ben-manes.caffeine/caffeine/2.6.2=6521F1BFEFCD6E2991A7D017BBA8D751C5BA4694D335B61B4E732A2B795C748532BE7A5A63107B6BB70F816CEEEA4659B77EBAC68AD02C44CD813C478F759A06
com.github.bulenkov.darcula/darcula/e208efb96f70e4be9dc362fbb46f6e181ef501dd=80F3335D8EA3FB3FF07A12A79C958C4E3F8BB542511C52825A8B3694AC96F027E24396CE9EDCEFA44EE93B5CBED4E4AED4575E6AAED56F363BAE92C52EE85D22
com.github.spotbugs/spotbugs-annotations/3.1.12=8B4EABA6A44232B3E62F37EAAC146C2BD2222D4AB1BC27A8DE80130D06D22AB4383C62CF05F5A7FFB7E162B81490C81B1E84D42C6A6EC5A379221A8435EDCAED
com.github.spotbugs/spotbugs/3.1.12=F27658417C5EBB620F32353DE4ED0703856E749C0739D3E975AF3F5D295C778D9A0D8057D90EC6614AEC17B5104BDFA594FBBBA39BA276FF47CAA25F2FDAC4E1
com.github.vlsi.gradle/crlf-plugin/1.17.0=473E13699DDDE54F2B7245BB33A47346E907179F7C528751B0BB730005BCAF3FFCDBE3F1333655D635B0EE2683FC8B24F2BD598922F9DA3DA03F8EC25A373AA1
com.github.vlsi.gradle/ide-plugin/1.17.0=4321949B8201BA4F0E1F0D977397349C34DF84E4632DAFEE6F221F9AFA176FDD9497C9AFBE7F734E3423BE25351DCA7551F93181CC99A99A24EAAEB43BCBD544
com.github.vlsi.gradle/license-gather-plugin/1.17.0=E1EE1396B2838E03FB7C84667BD473BAB558569EB5F1C4CB9B7C6806FDC5C7DABC41AAB1705A0FE73FBDB11624F11A15D7394232F59AC1039EFA197FCB495E67
com.github.vlsi.gradle/stage-vote-release-plugin/1.17.0=575A87846F61717B2F220A485B67D253644980A0DD57C8EBD3F07C9D66E9B463115897BFE3364216445CAB4AA09EA4B27070ABA5BE7620A632A95BE3F414D464
com.google.code.findbugs/jsr305/3.0.2=BB09DB62919A50FA5B55906013BE6CA4FC7ACB2E87455FAC5EAF9EDE2E41CE8BBAFC0E5A385A561264EA4CD71BBBD3EF5A45E02D63277A201D06A0AE1636F804
com.google.code.gson/gson/2.8.2=C0C6DC5D609950A6EE3C7E5EA493DA0E6906A18F38FC5A23CC792C1E09E0E892344B4AE2DD35879D6101533E485784E1ECA5052E0AEF44A724CA8A8EE4D73F04
com.google.errorprone/error_prone_annotations/2.1.3=BD2135CC9EB2C652658A2814EC9C565FA3E071D4CFF590CBE17B853885C78C9F84C1B7B24BA736F4F30ED8CEC60A6AF983827FCBED61FF142F27AC808E97FC6B
com.google.errorprone/error_prone_annotations/2.2.0=8F5F13FAC4C40D680A1F062C609AA598E7585684AF37D695357738935FC0683DDCB94C880DDDD03E78B1DB071C2E5CEBD054A061F8F24322C5FFA43ACA34A859
com.google.guava/failureaccess/1.0.1=F8D59B808D6BA617252305B66D5590937DA9B2B843D492D06B8D0B1B1F397E39F360D5817707797B979A5BF20BF21987B35333E7A15C44ED7401FEA2D2119CAE
com.google.guava/guava/18.0=C84AD9F1646B52B6E19F55C3C63936C6DBE59597D53CEC6855F85E21AD26F9BC27B0C541B793FAB117E2359B1BF3FCD59B222255345FCE858BC03CC48CBFFD65
com.google.guava/guava/25.1-jre=429CEEEC0350BA98E2B089B8B70DED2EC570C3A684894A7545D10592C1C7BE42DACD1FAD8B2CB9123AA3612575CE1B56E1BB54923443FC293F8E9ADEAC2762EE
com.google.guava/guava/27.1-jre=5C32A58148C3B91577CD6D335D61A1994041A2A5C77A240303BA6E786C895336400F6FD449EAB0802594BF47C17985C5587AB87C3C4B628BFC1D7090DDC0B006
com.google.guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava=C5987A979174CBACAE2E78B319F080420CC71BCDBCF7893745731EEB93C23ED13BFF8D4599441F373F3A246023D33DF03E882DE3015EE932A74A774AFDD0782F
com.google.j2objc/j2objc-annotations/1.1=A4A0B58FFC2D9F9B516F571BCD0AC14E4D3EEC15AACD6320A4A1A12045ACCE8C6081E8CE922C4E882221CEDB2CC266399AB468487AE9A08124D65EDC07AE30F0
com.googlecode.javaewah/JavaEWAH/1.1.6=FEA689D1E29761CE90C860EE3650C4167AE9E5ECAA316247BDAFAC5833BCE48D2B3E04E633B426E3AB7EF3A5C9C7FD150FFA0C21AFDCAE9C945CB2BB85F8A82F
com.helger/ph-commons/9.2.1=C82A4C6AA1702B95049A8348B88F3A5ABC5B4781A796328E46E701F57C0DFEAC289441D332E1D730EE46107AB24AB106CDE2D39BB8BEFAFAC123D53382B85A40
com.helger/ph-css/6.1.1=EED6A6C680424C4337A8FFE8431F5E042841FBACE3529622125837F9E4D89B3DA8675BD74799957384CAC77ACB9F0AE031BAB3883CD87291E03ED823EDE8EC31
com.jayway.jsonpath/json-path/2.4.0=B55B30CF85CA12E6A492FD48D4B6BB0B1F3BA610C195AA1A36EDA2A80E24BF7688A6A802362D398108E822F6DCB7B713CF421BB4208897FC4F5CC7B8B9B4C97C
com.jcraft/jsch/0.1.55=B6827D8DE471682FD11744080663AEA77612A03774E2EBCC3357C7C493D5DF50D4EC9C8D52C4FCC928BDFDD75B62B40D3C60F184DA8A7B8ABA44C92AFECEE7A5
com.jcraft/jzlib/1.1.1=223AF0806A19FD25E2496C980B9824B7612528013EAB9E7E21161ACFE81A6F808D3D65148BDAA794C9AB73C518F6B49AA7A69107C9BC0D66D6F8E78C39964F8F
com.puppycrawl.tools/checkstyle/8.22=880C32F20AA476BD2209FF77AE04BC65427BA2D47401EC9372F1385EA43BDE9055539249DB2D8429325D2EDA0BB62152C9E3F21C25184A04047649A5C4B61098
com.sun.activation/javax.activation/1.2.0=B4CBDD8FD1703E4B2E1E691DB78FBCF2232D836F740D1821C4C191A14F9472508E27A40D06E4B6B153964AF68032959C22945BA169A0CA4018B7748162F420A6
com.thoughtworks.xstream/xstream/1.4.11=ACEBA38FE0239A8D873D276023F9EFD1C79CE8C6651BB7314A06684758AABFCDB1E89A71B26FA596C9491BDC3D4BBEEF3819683D65002E584CD4728A03C2DE0B
commons-beanutils/commons-beanutils/1.8.0=AA6C0E0A8F0422964025B36FC2AC8FCA04C39EA697C7DFCD265CA06FC3070F1F639083C7EDC00B2A42D8823AB4375023C6BCB198BB606D56DB0AA67FB1A671D1
commons-beanutils/commons-beanutils/1.9.3=F19B50135FCF20D9B4FB193CC651C97081D389EF320A691B51637809E7E99ACBCA2B28BEEB60F0997525FDE923125FEDEACF7FBE17D203F97F1C3A66DC84D3CA
commons-cli/commons-cli/1.3.1=383FF22040787D7A27E18B414892DD204BA0F9D75E43EEE775C1276D6DD6EA2A38FC349EDEC1B2BD332FB0BD324DCC8CCCE084B98D47BCAF8AA443773FABF3DE
commons-codec/commons-codec/1.11=D9586162B257386B5871E7E9AE255A38014A9EFAEEF5148DE5E40A3B0200364DAD8516BDDD554352AA2E5337BEC2CC11DF88C76C4FDDE96A40F3421AA60650D7
commons-codec/commons-codec/1.6=752FCA09371E0E228432155533A9B84F0442CAFD7F25EBF0C6C2024D541FBBA80882E71AEE047EC94CD22C0D8114942E967652913412F5CBCF9B816C0E1FC1AD
commons-collections/commons-collections/3.2.1=8D0AA0E4E328C2E391D4D972F361A19FF085F508CB0478F5967280953ABD3520EE92CC1D19B21CB4E29E4A7BC557487DDBAEE9807B751824241269367B9E92CB
commons-collections/commons-collections/3.2.2=51C72F9ACA7726F3C387095E66BE85A6DF97C74B00A25434B89188C1B8EAB6E2B55ACCF7B9BD412430D22BD09324DEC076E300B3D1FA39FCCAD471F0F2A3DA16
commons-io/commons-io/2.2=AD08841278FEF6F1EBCB2483059882175D30481C75FAE916F768D08087BF6159C7D3F4A7EF382F45EC2294235BBCB596C60B1FA98AA04E9DFD8FBAFBFA2CAD2C
commons-io/commons-io/2.6=4DE22E2A50711F756A5542474395D8619DCA0A8BE0407B722605005A1167F8C306BC5EEF7F0B8252F5508C817C1CEB759171E4E18D4EB9697DFDD809AC39673F
commons-lang/commons-lang/2.4=AE35B761D16F4327CDB6FDA16789166FC67020EFD71FD2CC3395B97444F439DFCC7EEE948A3EFD3B02440416CAEB873417D95DB6A2B16F4EF198DE9D1AFBC045
commons-lang/commons-lang/2.6=4A5A3DBE4941C645E2CCA068CCA5C1882CFE988B02E7CD981D1E51784900767D1DEAB0E0E0566F559C9FCABB4A180E436D5BB948902D4F4106F37360466AFB42
commons-logging/commons-logging/1.0.4=C8D2D39A60ADCC49091D393DAF30473D1776E4B6B09BB86639171F660833A17AFBDC9F3E85843093535DA16FA664CD7CD4CA38F54E141018DD1B78DE681AD668
commons-logging/commons-logging/1.1.1=470323A2EE38BE1B7FF8C84F1F5A5F8C4EC2CEB6B0649FAA7B961F111865877DBE125409F72B1C52C7F18AA89E3469635C49FF4B83F86CC2F2EB2CC5562F9BFF
commons-logging/commons-logging/1.2=ED00DBFABD9AE00EFA26DD400983601D076FE36408B7D6520084B447E5D1FA527CE65BD6AFDCB58506C3A808323D28E88F26CB99C6F5DB9FF64F6525ECDFA557
commons-net/commons-net/3.6=DBA414CEA9FB4B47DFE6D20C347BD91052185DD958996BFDD1E709F66B5FA7812EBB0DAD80C47E72BCC0075B3B5526C705216EFE771CAC1CC53B2F7923124FAF
de.marcphilipp.gradle/nexus-publish-plugin/0.2.0=36DFDADA6745D7AF5CF2807E197AFD111073C30536CB29C531522F73D4086C2A7AB70756975FEC290657012B8C9090414F76811731A920D8BC4EEC1DEC0AB2DF
dnsjava/dnsjava/2.1.8=A4BCB8BBB43906F42FAF1802C504CCC9C616E49AFD5DD7DB77676D13AAED79A300979FFC2195B680A9C6D5F03466B611B6F1338D824099816AA224B234760F4B
gradle.plugin.com.github.spotbugs/spotbugs-gradle-plugin/1.6.10=E7486B32EF6C9C14FE879814DA5F06CA6ECABF47195063A93E6FC8CD10119244C5A7BC3C71A4760CCE3AFFA9E9736336D345D8ED84EB65153C15683FA6529D92
gradle.plugin.org.jetbrains.gradle.plugin.idea-ext/gradle-idea-ext/0.5=4A6B7FA6CD8C6FA82A517C396510E408F1C6FAB5FF6D4C68008F80718F05E5943755AA240F329C95661CCB0231114DD0F6D7C38EFBF73EE6B1ECC70850F40F7E
info.picocli/picocli/3.9.6=3DDB7ABE7AFD0AFF754BE5616481C589E1354692BE583179503DDFD5F542A7F520960A6FB0D5320E171AE02E3A01B9E6B51E298B74518F8BF690EA9E9C7C8162
io.codearte.gradle.nexus/gradle-nexus-staging-plugin/0.20.0=E59970ADFA3343654A7A879299BADA0915D89F3A2FCCA53AACD26EEFE621D7EC598019CC32E9C38DDD35AC1B2E40B5167801A34E39E00FE72755D5FBB16236DD
javax.activation/javax.activation-api/1.2.0=8EE0DB43AE402F0079A836EF2BFF5D15160E3FF9D585C3283F4CF474BE4EDD2FCC8714D8F032EFD72CAE77EC5F6D304FC24FA094D9CDBA5CF72966CC964AF6C9
javax.mail/mail/1.5.0-b01=801A910F70DD743982872DCDEA46C24C6378E82C2CD2D970902A9CE5864191D3847BCFF6D5B81AEB89BABF056A30A70A03AA5687586D52CBFAAEAE3A5D6649F9
jaxen/jaxen/1.1.6=6BD11529D6DFCB27DDD485C8DA2440D3686CB61693A9461833A2BED49407343DF4BA707F45164A6E69B78979581D91FBF0F6C5EAB28653DCFA724AFC89529778
jcharts/jcharts/0.7.5=3953900BEBE38F4242499D106D59425F54B73C0478C3050F0DC0917D5C36CC35F94CCFEA96E6BF85E9B1282BD572F55AFEF1B485F81F5ED9493CC4D3828F5A0B
junit/junit/4.12=5974670C3D178A12DA5929BA5DD9B4F5FF461BDC1B92618C2C36D53E88650DF7ADBF3C1684017BB082B477CB8F40F15DCF7526F06F06183F93118BA9EBEACCCE
net.jcip/jcip-annotations/1.0=CB312B3F571D91EF183C119D878F50464FFD97F853B7311CBA386463F295E8B7B3A5A89ED4269A045CACD5AA7CB4C803D4882854A0FDDEFA9BBC28C72AA6C786
net.minidev/accessors-smart/1.2=39FE6A5EBD2AE2D33D8737C8407A8CAA4F6A62CE2057D726BB82496D35104B76F230BBB9721E1DB5F535FEFA3D70EE88C0A5A5E4A3F1266D7317CAE897AD0882
net.minidev/json-smart/2.3=977FFE05C17965B403A60471EB6C160103263BBE454E942D67D4D725E1826B504DE6C15038FF01EA90632BF9AD8A31B47C6662613BB905F020EFFA68C44D6F9A
net.sf.ezmorph/ezmorph/1.0.6=16D30BE564723B74F312B4E7D06F349370FB6726B3162778C869CD723ECA2A40C4972C2757B3E107E1820CEC0D70B0BD2B96EFCD466518FC64495F7AEF97967A
net.sf.json-lib/json-lib/2.3/jdk15=ED6E95BF555AD3193B527258972DAFABD73745D993DA0CECE486E34A471D080850D201864026F4F41CA0982926C264C6E6CC55D91F000CDFD5D09EE3F306735C
net.sf.jtidy/jtidy/r938=4C6CC198BD8CDE62B6CC9091ED95A4114EAAD035C196317C891F8F2263B28649A33B1F26F74F2B043A17CEC2A3D025EDA81ACF317FDF2D04641FA646E486B345
net.sf.saxon/Saxon-HE/9.9.1-1=DEED3B397975A8419C903B61A1FC54C1E3899506B6D8DD562425DFD776690C51A8BB5326B821AFA4892670F410688255506CB0BFEB8F7532B84914A11490CCB3
net.sf.saxon/Saxon-HE/9.9.1-3=6580E24632116449CB420F8D854FA0AE9CD61E3029586922F658D611EF3E735EC8D62A80A0A102C31C020C8EF6038E8817AB4D045E6B9A7B2FF67885CB361FED
net.sourceforge.nekohtml/nekohtml/1.9.16=54167FD0D2A01E393BDF00C4553144ED53935643F0B278C052AAD29CC3DAC3343FE0D181437FB9F705B7BB46321ACD0F4E46159874AB17C055183CC2A2375DD
org.ajoberstar.grgit/grgit-core/3.1.1=B856459DBAD417987ED640ECCD77DEE8E16589B75741BE4E985A028BC1ECEE71D1E3FE75E2BDDFB5342D54D497C41F9368F99C5FD77892C4A48E46EA37E114C8
org.ajoberstar.grgit/grgit-gradle/3.1.1=B168B7249D83A2C156BD7C3F59E1DCA79ABEB3AB9F32AB548C3A429814FA5095E678839EB269DF332D0F003A7CAFAF3D69E07C0B8B123A4A8EA2F32C56A6C608
org.antlr/antlr4-runtime/4.7.2=F057286FA0F7E3D0CCA414A348893577288882B887C0278DD0C012447D3C48AC150B30E023F886F038C6B0A144329FF927A3869AF5534D23B279CF88F302E0BB
org.apache-extras.beanshell/bsh/2.0b6=A39321A99A8A619A48B65752F6EE6B8F11D3B28EBB051082EC70A70A0D5041E83D144378DF191929E3D6562BD5EE4C4F1CCADB0BA42055529D18800A41D8AE18
org.apache.activemq/activemq-broker/5.15.8=1092F81D61BCD0137130C4A553B028B021D02EEE9E0B1E5B38C9478204DE1174B9AC5399222BD49F0E5E458AE1432CECDCD1B3412A849986AEB14DA766C6189C
org.apache.activemq/activemq-client/5.15.8=FE9A38BE230C9F034C53F0C6416B2C668C7DDB975B693E3A087FC1433200CBC717116841981EA0D3D6A0C88F220ADAEB4CA248DD7D243244D84F12EA7320FC28
org.apache.activemq/activemq-jms-pool/5.15.8=4606604A8C2F1C596CA9C3294A8218D022FA30454FBFD61863CA0C6CF4398B069FC90CEA89201C4CB2B2AD87C171603095AC9F46EE142C089755429BDEB49344
org.apache.activemq/activemq-openwire-legacy/5.15.8=8B730DA2BF0755A7C486CA5C495F2F43C3C043F6E33C0FF34BE31C46403B91BCE87864AF44CCD8D305ECA1D778736A84238A7541AE3F61718F7863E1024CCAEF
org.apache.activemq/activemq-pool/5.15.8=78202EF368175E05226039F5620884BB48DA1B254DB99EE136F023A6A9730566922FA37F26715E7E8BF0B0394C0268C2A466DF82365DC867508E11D41D67F4B2
org.apache.activemq/activemq-spring/5.15.8=CE11F857A4CFE55F8CE994F31F60B6D0EBEB1DC9667BEBA3CDF63C7E3F3C3C7E5ED3837424FA58A2A35CDA0A76E1B1CDCE69BCED42893550E9099F90482F9115
org.apache.bcel/bcel/6.3=76073839812981106BB7089668B5421D0D2E1E8BDB272FC79EA5A5D51D27832BB8E8B37C344DA173A54A19506D9BE43BCE727F24C5360AAA530B2FFDBB4A4435
org.apache.commons/commons-compress/1.11=D7553179576E6557CD2486730F0E54F93E8830BE16C32354BE16FDDC62BED7F854909A63E87BB2F2856577522C3EF95CBC3D883889E95C3C0B2E4295F57DCD86
org.apache.commons/commons-dbcp2/2.5.0=9CEF8B6F4DD907A63B1FA562A9D2497D84E8A9C7839955742B134421D63B0CF0A102802CAC97985842C0231D6E76CEFA9A29C6A3378955517E8BE192133961ED
org.apache.commons/commons-jexl/2.1.1=DCD62490CC386516F66427F5E478C308F6937EB6D64A34A02DE56255129DED20BEDB85C01B5C794D95CA3C4D6A11D58FA920779C5E517B78A881C5A229E4FBA2
org.apache.commons/commons-jexl3/3.1=6AD2D83CFB29CB6C19DB70D4A89E8BD317B10DA736AC0B9B37C3F4DF8E428AE5987BF73AA1BA9439955E7278B7E056B009B691E2E64925E3E3C5B2CFA1349D9F
org.apache.commons/commons-lang3/3.8.1=FB0FE98385496A565678A000C26A3245082ABFBF879CC29A35112B4BF18C966697A7A63BB1FD2FAE4A42512CD3DE5A2E6DC9D1DF4A4058332A6DDEAE06CDF667
org.apache.commons/commons-math3/3.6.1=8BC2438B3B4D9A6BE4A47A58410B2D4D0E56E05787AB24BADAB8CBC9075D61857E8D2F0BFFEDAD33F18F8A356541D00F80A8597B5DEDB995BE8480D693D03226
org.apache.commons/commons-pool2/2.6.0=C31D44FF2D527DEC5189BAF8AE1D888C37A53A60283C58CBEACD723C773DB8219DD54E0FCA15F29F781E0AF66E60E894254D6AAC80178207B51DD2F9DCC972C3
org.apache.commons/commons-text/1.6=A0C077E33C075FFD2A9BF6776C1C27F6D19B451DD6F9A26CC06AED586BD746E5DADEFEE72E130F0D43768F8E3F24CDDABE79B1E94ABF227FBC8E8C58DB0C6504
org.apache.ftpserver/ftplet-api/1.1.1=70C9E913E578460BB9B8F014C47B9C9634B9454F194EF105CFD4EB896857DC47D292B1AB88C267FF6BC0E608BFEA0BB900DB6E4D88E5F5D9096EF6A4B4CDD51C
org.apache.ftpserver/ftpserver-core/1.1.1=D880495D077694475D27C081488728085FC19B8E1F113E8BA64656A3DE0A7DBC612F341EC653F3CB719B889916DE20DBD188898EED7A8CFECBAF9BE52A237118
org.apache.geronimo.specs/geronimo-j2ee-management_1.1_spec/1.0.1=32E38035E7A9BC63F31CAA612421BDC33DDB9503E37C97B587490926D35831A8E3C2FEF324ACADC9A301AA977A761B36C94188A64E53E0AEC8641B04A21B3597
org.apache.geronimo.specs/geronimo-jms_1.1_spec/1.1.1=94CB8660775596B298DB93E11FDBB28D2A582B161F7A6D667D41946F59E8B114AA80E15C28C4186F05B43F432B1AC555D845AD870309609202382C3F6061E319
org.apache.geronimo.specs/geronimo-jta_1.0.1B_spec/1.0.1=F61164A57A83D7C5383E28EB7C57182A94E0966B3194BEC51720CE127AECA0C8802106898FFEEDEE00D55C59277104A6D04C2183BBCE7807AE5336AA83EF2323
org.apache.httpcomponents/httpasyncclient/4.1.4=A80DB5DBF772F02D02BA6C7C163E8DA9517DD7195714B495ACB845C429580C1FC926D3E71C115E75BE8C145651DCE2FDFA0DC380132F7809C14B3AD95492AEE
org.apache.httpcomponents/httpclient/4.2.1=675BCAB061F874E7903655D86F25F838CC8DF206918875C6E6C747313A4831CC68EC85A0AB6D0F3DEC96247EEEBDD700F47A0024375C61CC3A371B2B7DDD2FC9
org.apache.httpcomponents/httpclient/4.5.8=DEB6B66065CFDED63795B934E18C3ACABEB3CAFE8A34D3903ED280284C7B2A3F801711AA5413699EA72CB8356D8F5C81F96BEEA5B910D97411F99E3220FCA2DE
org.apache.httpcomponents/httpcore-nio/4.4.11=921BFA77D06C2B624D257DC6D57689A06F704954AE49FE4433D5200018F46607A46EA21ECA3C7757913BD6C1C2605A025BEA912A007230EA2E4227C07F8ADCA3
org.apache.httpcomponents/httpcore/4.2.1=BB378ADAA1B431269E5D711735005D899F09578A115CB4F0B37D797F8ABAA43E57581DAD1B7BE925893BFF5217286A37C3A5EFDCEE2284974C7D2C69BF0AC234
org.apache.httpcomponents/httpcore/4.4.11=1F45A26F97E5488BF1985F5F5C88C5E2744F46D422040708F7641DEB14BB04561BCEC35C9284C1DCE606FCDCB768EDC3EF970EF965BD6BB591EC362DFD417C74
org.apache.httpcomponents/httpmime/4.5.8=E44EEBDC57A0E2F99FFDD7907A8D5ADCC18FF05FF5CE353AA7D05A2C7914272E6D4746F09399DF024C2663E1838C6477581D2787B8D07B8EDD3B18D526381993
org.apache.logging.log4j/log4j-1.2-api/2.11.1=7FA86AE3F19F88C0690D12F7ACD04D270E365C1E925DF0A8012DDE7B8B3EA1F787D34C9FC26B198D7D8054F7BFADB522A34C4B8C1C7998E7C138187C5DA4060E
org.apache.logging.log4j/log4j-api/2.11.1=A598DA3836D2DDCA60CFB3D62DF96E525A8A130CB67199C3FA0380E722B82B8F5778372CCCB763BF8AC216112C3E5E6300FC5B85E097845F42FB743ADC1FD41F
org.apache.logging.log4j/log4j-core/2.11.1=6D23ECAF0AC18A5DFF492B8F047543B392FE5D1D56EF1F9F6C68CFF43C7EE97F2FD8521C22D242E5ACBFF9C133E9315045D6C689609F9C7DA3DDFC3FFB96B261
org.apache.logging.log4j/log4j-slf4j-impl/2.11.1=55360BF9BCD47DAE49FCC8E28DBAD9D3AA26BCC66729DA98D701CC2099CB070E537F19327FA52486B4E557FA513D37AFBBE6FD17B1557527FB2496F56072545A
org.apache.mina/mina-core/2.0.19=B494D592C42D4F8C70BD5F1927A71729E12016F28FAC77BB41286186A69C530B7B486DAB8A44C7B09BB8BD44B960FBA10246E5D61420DE6FCE1E29D0FA22C202
org.apache.rat/apache-rat-api/0.13=F12B23C33D671563E9314B8790848C71E69D4D4CFFA6BB086F02AF5DEA7B7FD74CC2DB0548C57F5484A3C183E1F0766D0D2F2018D96A567A2E3B73C398282504
org.apache.rat/apache-rat-core/0.13=E0788C9F3BBAEC17B5BCF5B029118254BCEA33BB9C2DB70E19B3EC76B116C53723CF2B508C3AB904A1D7302BA82FA64BFB24A027D5513B3AC9A5796CF68A4A11
org.apache.rat/apache-rat-tasks/0.13=229F74F96C74E421A37A00A57F3153FF913B77F34514003695DCA9F5D63D8D5FF429A9E055425CC925FA30328023D52812FC6BD66B5EC736B529784B20D19344
org.apache.rat/apache-rat/0.13=A51B88495D1988D6886CC04D0039FD9F6AEE77D060719239F9C5E9AF2B6D9A639E83C38E8BF4FDC632D1F0FEB87BC43FC0B345C0F2A4B7F692303898AADB2663
org.apache.tika/tika-core/1.21=9D3131D7E5FBAB717F2590F4FE0DF161189F29490F7D3238512E68924953A136497C37B39A9260B9C6350B335670DB207FA8A45838F99D60C1E906872BDA1EDA
org.apache.tika/tika-parsers/1.21=2728CA01817F9509912E738E65BD42F4A0296E206BFA3382C0B7EB5935A3D19C93142D4C0B589DE0BD582CF41AB54A3C374D0D7C2A9D555EBE086C7E90278ED9
org.apache.velocity/velocity/1.7=E521785D947CAE1A02070B26A43D235B6319439A6364C58266D3F9C458F9A099406C10AAB5F51C5DB5BA541E88322CB35203C6758B4B8BB65F9539A345DA9A04
org.apache.xbean/xbean-spring/4.2=F6BC463D2E3A140DABD48AB99B8B99A6607611A6B448D0B08D56A7B496080B4DDAFB97808B9EE25EEAE2BE8994213FA42C74921F4169F5BB288F473E7A92463F
org.apache.xmlgraphics/xmlgraphics-commons/2.3=2914C30F5A58A1EAA19B51399EEFD30F3A4D530D19BE5A74AB0AD5D93142F13C5DDFE9FAA3E95F2632C14E18F39AA1AC3090061D32FB79A1A69AD9126F51AF0
org.bouncycastle/bcmail-jdk15on/1.60=79B43DF17AB209A1026FC3CDA644B2611A72E861D3673CE846E078CED93A0991E16C91667FA854FEE7E92F5553338D1C9783BB2FBF426EB6FD19C8CE3582B26E
org.bouncycastle/bcpg-jdk15on/1.61=1986D1385AE7591635F758902BAA37064752C356973B44E40077D690E7D73E3D1460207F48D2F193CA05E4B8ED1D364223DCC3BAAB66037AA00BB492D5E6302D
org.bouncycastle/bcpkix-jdk15on/1.60=D44CDAC998A0D804AC452725C9E84B7D517C838CC6770CECDB214E1DF50EFC5EC2D067A91A5009F1316A5635CF7A1D213F2EE2A4E7497C66E1C7BBD5D2D4445F
org.bouncycastle/bcpkix-jdk15on/1.61=BA8469294D658E93880FDF2B1DF88AA501BC6BF1613D7EC6287A362078AF425BB645234E85A1C737B582EB01E1DA2AACCC33326A30E0EFF0CB5616EDCF6FB008
org.bouncycastle/bcprov-jdk15on/1.60=1C08D82349E333720C08FC467FF6489B14B8633A09019BF8BB5E6A3C426DFAE6DCC415648FE1FB4A2DA8631548F4947AB6CA1BC90B3190A05040F4D2EB271A10
org.bouncycastle/bcprov-jdk15on/1.61=2F09C3E8EA8666620CF32A0BC3D1B8DCB562EC4CB06B485D038956FA2CC898AB11132A675B3C12CBFB00A1CA96DDF34ADC0C1B5981FCCDC566557FC6C533673B
org.brotli/dec/0.1.2=D4CD2B33F7C358012FF01DB6A13EBFE1E8051A580698BFFCD942C47451012CF53CE49A400B1C8BF7502B01E631D79D7C6417202A145622572D79FD145CCDE61A
org.checkerframework/checker-qual/2.0.0=3C38B0B9E0BDE464268CFF5FDB1894A048240B039093EE3ABE5B32976A22737D26B355F8793F630A7F0B319FDB019A6FCD9EE1D5219676F0F10C0B0F496B61B7
org.checkerframework/checker-qual/2.5.2=FB32E3893F9EBC956EF99066B219A8FC8049B47B80A7253CD89B7FAADF0A2FA14D60B52DD5C2F4AAEB1DB0359F49FEC9E29D3616BD314EC8C82DB1C657BE8CD2
org.codehaus.groovy.modules.http-builder/http-builder/0.7.1=BC7BC2A514F8CA104A392ECF8736F4A3D316EE988FA91299D33B0AF46134B38E14E4A5061449D17B2DF7A521643E6C02DFA37CC277ED7CAB7CE83C28C00E9719
org.codehaus.groovy/groovy-all/2.4.15=FC30F48E1D64959BE90CD25C4E68E44AA3A9D80D319323A291F2655C65036D860525F55ED902AD0E5CDC114143D20A165876E80DFE949E5C9AD4D8A0AD7F39E7
org.codehaus.groovy/groovy-all/2.4.16=C2616868541A3F587CBBA9BED3CFCA234565C1FD896654D6FB1934B452F05759A93F9614952D9620C1BA066CD328E6D55A349F1738BCEDB3EFA65A862FDEE09D
org.codehaus.mojo/animal-sniffer-annotations/1.14=9E5E3EA9E06E0AC9463869FD0E08ED38F7042784995A7B50C9BFD7F692A53F0E1430B9E1367DC772D0D4EAFE5FD2BEABBCC60DA5008BD792F9E7EC8436C0F136
org.codehaus.mojo/animal-sniffer-annotations/1.17=94D0335CDF94AA547AD6C0C7E44B8E3BDA736CE19D941DD0FAA3A45390E5AB2D122022FF4E07BB9AAEDD41FFBD9500F324E0A9E42F4C5441BCE0774F44872F45
org.dom4j/dom4j/2.1.1=547DA0752FFB12CE40800449376F2F7E20F053F816DE4AE8ADF1A4FAD5A3B87CE4E98E95650671A6C9CDCBBF7C20A4B61E711E5AE8D324C923D508BCB07E02E1
org.eclipse.jgit/org.eclipse.jgit/5.4.0.201906121030-r=874E2F245CA184BE72BA97E8AB4539E76B6D223D20DA27620355BBE812896DAC1CD33C4CDD8272C8FA9A346C6E80C986BA1EC290C973D0EF4B7D44EF42692523
org.exparity/hamcrest-date/2.0.4=DC0FB7DDE5B151E09C619C080BD0AB6405596A0E926126342C65EDE6E25F65519B5B6A02BF25C02AD75A31EB26C6B41672CDAB97CC8B5AD983D025651A33CDD6
org.freemarker/freemarker/2.3.28=44435CB2B6BA02ABACDC4A21BEA44A2DC50FAA1B486FC5B2F79097A68F1F98CA24AA835448AC5DEC33A1869EED1B8A32AC285E95FDABBDAFAA810D575951894E
org.fusesource.hawtbuf/hawtbuf/1.11=396966ADF3E8CBA09FF75297915D41BA6A7C60C327575DFFF153F6617A1BCAFFF4A1AC0BAA19D93B4DDCAB511C5E23A6FD95AADF45E55E2057700DA3B8991AF0
org.hamcrest/hamcrest-core/1.3=E237AE735AAC4FA5A7253EC693191F42EF7DDCE384C11D29FBF605981C0BE077D086757409ACAD53CB5B9E53D86A07CC428D459FF0F5B00D32A8CBBCA390BE49
org.hsqldb/hsqldb/2.4.1=7A4B0F48072894C9CAD7352785465F3AE232AC22D79018053D8463EE143243626047AC19892A6E43325D172C7948BE35EDA54278F194B7A611B3DC032CFD047E
org.jacoco/org.jacoco.agent/0.8.2=E0B59440237E2953791666EC5B7080ABCDC0DD1827FD701CADF2CF7FD805E11BAA3CD1749E8BACFAFBB18BF482AD6D93C37CA9DDB950103B0D05E0BC00BD034
org.jacoco/org.jacoco.ant/0.8.2=F0532CF26F47F6952088BD336900BBBC8688788D71237EBB54EFDC2AE2635E9EFD2B96A6E4F03CEB1ABC4D7CB0138D526A27C5FD5CCDB013569E4F90051F7D55
org.jacoco/org.jacoco.core/0.8.2=7422BCFECBC36548475319FD9C896A9052F98798F6AC0D602614526C620C9CC7880BB05D987089FC41299D817C92A92E12E72D6A51459740A3BF61582B613669
org.jacoco/org.jacoco.report/0.8.2=EDE1B3CB978D21F0C65916DDA286732532D1A01450B2B833C9B8C7046B935167ADB63DB24B9ABF0C93AE155B7E8CF5FC74815711704C001093398E4D0FDF081
org.jdom/jdom/1.1.3=921A79A4759724DAD02830E75FEF0F3A3B2BB1D14D572CA4E1F97BF7A93CC5413EE41B3B231331F1EF459E77F8AE1FBF43DCDF621D18BD72331F98B24C4E8284
org.jetbrains.kotlin/kotlin-stdlib-common/1.3.31=53DF3352743FF6756CA8A5A63EE04DE27B9FA873204F89823C4906CFE33BC5FA91899B35B6EDADF852F7DB2C300D56FCB2D32AE4606EFBA4E3BFF32BEED5531
org.jetbrains.kotlin/kotlin-stdlib/1.3.31=1DE7F0A1E0920D179DD3677D78B8D4AB009F04FED8919584A4190D4B69C2D4754454613A91BD41A66DA45E48F9E23B6AC5BFFF0B409F81BE1746556298AD698A
org.jetbrains.kotlinx/kotlinx-coroutines-core/1.2.1=203FAF28151C4B20C932D716DA4799F44F1B32A32622CD0AECEB649FFB0C45B295553DAA073266D96020687A163EE4A6E0601B2EA9EF93E3785BB8FB07CFBBD0
org.jetbrains/annotations/13.0=5622D0FFE410E7272E2BB9FAE1006CAEDEB86D0C62D2D9F3929A3B3CDCDEF1963218FCF0CEDE82E95EF9F4DA3ED4A173FA055EE6E4038886376181E0423E02FF
org.jodd/jodd-core/5.0.6=359328570D17EEDB3CCE8C2D03A52D7C6345F2D1E590E604DF3B628EC641AC8AD5F845F783D74073BF60005E714E98D8B7D0EC1BE52F26A0C697477280FCDFC7
org.jodd/jodd-lagarto/5.0.6=63C216848091C043C6AD1670B8442C722D7620E3DA428BDAD6AC327CA527E8A789E2B07BB3CD635E4F960F80C26BB2FB8545051EC55CB2C59535A66EB5B0B7A6
org.jodd/jodd-log/5.0.6=3CE6C14823730ACEAF4CD0F86DA4F63BB47B1146163898B3F2A370E6890AD7F7EEB14D88D9916BF12B211236E9B539DC986C081A746AF00F3B78EB792CFDB9B6
org.jodd/jodd-props/5.0.6=63AB3951F0C167B28479B6030066B28C35E1B1C4944E978679B4365F8179C123FFD60EE9BA0EEE5AD0BFD2A592B73C999328B92F3E4B2F8376CD39A9DC1B4370
org.jsoup/jsoup/1.11.3=D8B4634950C8D7FE852C61C0538A7C4B271F5C39227593664A7A32145584E172CB66EBFA5301670DE93C2482CEAE83446BEBB4965A79060C5B28A67F1E3C0394
org.mongodb/mongo-java-driver/2.11.3=737A0D037A6BEF711539FB89E8D7388EEF8F7B11393291412329D76DFB0C1695718CB903E60C63CA8144C95F53CA9EF66E80B4DFD5DA73E0E989467DC4B61337
org.mozilla/rhino/1.7.10=FF4F8BFA5F1AFDD4F2E4C34DE8AA3CE18E4955F3804A3B864CB54583B7CB20621302786D625A2E4ED9EE879452F2E5BA70E855E65C34E58CF7F716D8A4515BC2
org.nosphere.apache/creadur-rat-gradle/0.5.0=45A6A697C4E514893A0AA530D12A61E537FEAA68C2429E959C68541DB08D1BDD52542AF1DE21F4472557551309C54F4E96DF48889F09F77B70C09139352BAA2E
org.objenesis/objenesis/2.6=23A593BDED8CB43236FAAD2018B008DA47BF4E29CC60C2E98FD4F2ED578FE2BADDD3A98547DC14273017C82CB19CE8EAAAB71D49273411856A2BA1A5D51015FC
org.ow2.asm/asm-analysis/6.2.1=BE273F8E886BBCFDA81180917145996AB8FD26A17264EBEB5E1FC2337950A309D64DC8CBD373220009728622A8CBF56B8578E960B5561C22EA66848D296AE44E
org.ow2.asm/asm-analysis/7.0=1A6CA169E9E2D29256F9C45570D89E5B039EAF7D405CCB3F7F79926552F2A0818975CE2C6ADCE3F1F59E28172E4303A1C790C52AB06263C61C9C8181FF279CEE
org.ow2.asm/asm-commons/6.2.1=CDF7DDB8E865B1C22C7532FFF68380FE4EC49A00C6FF3188BF265C4769E49E793B51621FC80A39B5BA2D49E703F100BDB7FC9CFF8F488C5153A9339334371411
org.ow2.asm/asm-commons/7.0=CA97B49EECE30DA774055B58A63C6E4F65A6BC4C0F40A829DCAF7164FBFFDEC10C6B2D9A22DF0A0918FDC83A47EA9906294AA99D3F170B35FD9E0632578C80B2
org.ow2.asm/asm-tree/6.2.1=20FE687C2F494717CCEB33C97704FAB7C1867EEA1A0F79B70C68BCAA72E7818F34921B6FBA7A3C1ECBBC7256E1D8E1A538F9EC5B4BD3B2A255D412D2BC2CAA4C
org.ow2.asm/asm-tree/7.0=81A223620DD16340D18ECBA20AB15CFE078F61AB0EC1AEF091AFCD282E3F6047B9800200412116289EC14917B5ECE9414C8009E92CC9A3333C677B5BFEC13BCF
org.ow2.asm/asm-util/7.0=6B9630AD4C5F6ABC2724F9D85A7C0E81E524F8B0BF25273DD5578EDC20EFC7AB400095CD48E904D2536071181A8E9F39635FF3FEE0986BD078016D2DFF8241B1
org.ow2.asm/asm/5.0.4=AFEE8F98EE21771F104318D95B839D9EA6EA083157BD62D8BC3462D9302DC20EA939D1B4AE2222F92F09B92BC9AB1317AFF02734007F716CC805FE49B92A8A5A
org.ow2.asm/asm/6.2.1=C8D0AB865B628CB5A71C2B8C5FC8AACDA3E286B14662C3287CE50A96E91990E959F1447D439BD7190D9088E69E4368EFBFF5890FA539F98776F514A262D6DA8C
org.ow2.asm/asm/7.0=B31699F50485DDC4E84466064CF5789A3E61BAFBEC53C4B9CB19FFEF07B36722D3EFDCA8722884FD6D6DEDACA65DB4DD6F71CD886BBA599E8A77971955167A60
org.ow2.asm/asm/7.1=7EBA7097109389F48FA9142BF22D225F5D3104D68013D3B8E0A6D4054A8CD0EF64614372BDCB38987D68ADB6D33A3804E98DDF112BA84DBB09D448CE702DACC4
org.slf4j/jcl-over-slf4j/1.7.25=A703864B269DE6F7BC98DF0FA98AA943CC327A4CA2915899D460E4A071FCC3FBE70957EB91B740CC935D0960B3D98F30C54A0A4019D7AE8C6D50F51EDB8D149
org.slf4j/slf4j-api/1.7.2=BFE12C722ED57FAA3E26FEF214D95B9BDD2192742901920954979926D51E7B1BF0F61EA538F858328F4D6A306AFFECDCEF9D52452530CD2FE5C03552350C0EA0
org.slf4j/slf4j-api/1.7.25=5DD6271FD5B34579D8E66271BAB75C89BACA8B2EBEAA9966DE391284BD08F2D720083C6E0E1EDDA106ECF8A04E9A32116DE6873F0F88C19C049C0FE27E5D820B
org.slf4j/slf4j-api/1.8.0-beta2=49F858C76964F7DBDDF715C70D3CE3A1872E8342CF1643EFCD429CF45BBA97B1859D2723F6565DFB811586B61EBF5B160B3950D3D93D6BC2C3568F5142E5343E
org.slf4j/slf4j-simple/1.8.0-beta2=D1C6A56ADD8A9BFAE1341910E457F7E561C666184F3F26B2DFA58F83396832AC006803194480000C89770B132A26A6C575687118E28A93D3A09511E22B9934E2
org.sonarsource.scanner.api/sonar-scanner-api/2.12.0.1661=FB8E10D511E99B0D22ABEF8278BB65CEADA21F37D413ECA060FC8E7B8741374B5E3D5A12EAB4FB63140D754528DE59BA615D47B5BA4CDC0F75FF4A7BCD42F19C
org.sonarsource.scanner.gradle/sonarqube-gradle-plugin/2.7.1=3C17B038DBD01BD523E7CD71E06F539BA4B804080BC2973DA206E2AF16511073AEDE8B72CA464AD1F561E786D9BFD2B71FF01007B93EAEBED2F2EE95E07FF742
org.spockframework/spock-core/1.2-groovy-2.4=407AEE08D0E6AA1E2ADC3C9A1C966D91F2F53BEE0C92B85508F1E03E99F0E669356A2FBF9F450DB8D5328AD16ECD19B1BE1C9023B5C00031E91B9799A30381C2
org.springframework/spring-aop/4.3.17.RELEASE=3072ABA1B4DAF91BC6BD985655032ECA0632FC043AF80AB1B823B3C21513C3715CD64C44A268A953A1457D936CC28A076218FD08AC953911F48A99BCA55E01B
org.springframework/spring-beans/4.3.17.RELEASE=E8A5A8527C7231BA6C81211C60786550EC26CF549A07E52AA9E1001C624D8C0D0A056D3C6AFEE77AA0D55C57C3DB26F2222F78464BE6F5DF458F9BF6B495495C
org.springframework/spring-context/4.3.17.RELEASE=5EFA9A98FFE014961E92AB7C86FE991A6C29C923345B2223630945AAEF108AD4A936C16984622AD16C81ED15BFD15707B907B8F5F587E7698C4523206B3D19C7
org.springframework/spring-core/4.3.17.RELEASE=DCCF185FEFD78AE16DF085A864827D4375C0321E5A143A927705103D86D6CE4ADBEA61394AAEB4B90B3C95FFB8C72E2991B593653671FD5E2A9FD12ADE64B00A
org.springframework/spring-expression/4.3.17.RELEASE=D4732DA2A25137B85D199DC26792B8510A213A782C04D02BD02FC54AB652F59CDCE8898DD79B5519E6ABFE93F1603924FEA76047F05063C2683B517270C69952
oro/oro/2.0.8=9A98E493C4D771322B1331EC05AB0E363A83D8AC2AF8018D96A44DF2BF5BFC97D33EBE6F6F93E46AB10BF1536F0C29E9D9569318ED49BC18B4E96B1A8B476D37
xalan/serializer/2.7.2=884D865865858A46306A3680DF69F3F0EFA0DF1313706B54E6900D36AF21E17CB6828F5A6BAC551C59F7F80BDD1CB64C3FDBDE44E213519C4AF87969E9E70774
xalan/xalan/2.7.2=F859C5BD65F6DC91E396CE91FE2F6D30B2354D6B419CD9EA96984C5403E5CD1342BB9362B0AE1F2792612F0DF731C4F7AC92F16A825BB7E22089C27A129C6C
xerces/xercesImpl/2.12.0=E9D62DC311DF808F88AC63B427BB40567C19CEC618A33D0A9C7C830B1BB7C64DAE263A5EE6C824D8E51A63CD24F49FE2EF4E2563D6E6AA0400F63E9BB35DCE97
xerces/xercesImpl/2.9.1=37A13B129F3536A53F2A553151A53997DA6DE7CE4D7231EFEEFD26A68C92BE309666F2EE1F527D3B8C38BC6ADDC9FCCBBDD0D134759FD88667976B0CFF842435
xml-apis/xml-apis/1.4.01=8DB0283B6840CD6407957D296B802E3EDF90653E2722F8E29F86C1C0B60996C4B43E9E065E6864DAB89B2138DDB0174D9B4FDDA4A93F94EEB884783DB82F3268
xml-resolver/xml-resolver/1.2=ECA19B8A6B04C279B7982B16F1763CA1D49B0081A8D4CA2B7419F057D22A0EC60795EB4D901C5EB25DD4A733248876AA2F522C17A6144A26C8EDE9FB2F84531A
xmlpull/xmlpull/1.1.3.1=54D1090623497E81270B2AF633268656E8855E1EDCE2217886431039516A391BA9F8D8DB3C21A0B5E51C7F7CB672D63EBE77BE75708B760B06F399486960F261
xpp3/xpp3_min/1.1.4c=34989289CE8ED861499F31742EE1E7B9DC3C59973CE915A7B561D33D98968E77DB5BB94C1692802CCDBD86D04CAA7DB67748EFAFB1402428B2D6AE3056497618

176
config/LICENSE Normal file
View File

@ -0,0 +1,176 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS

View File

@ -29,7 +29,7 @@
<!-- Verify that EVERY source file has the appropriate license -->
<module name="RegexpHeader">
<property name="headerFile" value="java.header.regex"/>
<property name="headerFile" value="${config_loc}/java.header.regex"/>
<property name="multiLines" value="10"/>
<property name="fileExtensions" value="java, groovy"/>
</module>

View File

@ -1,96 +1,22 @@
![Apache JMeter logo](https://jmeter.apache.org/images/logo.svg)
# Eclipse Configuration for JMeter project
## Eclipse settings
## Launching Apache JMeter from Eclipse
The following files should be excluded from build output:
> `*.metaprops`
See `Project Preferences/Java Compiler/Building/Output Folder/Filtered Resources`
## Eclipse.classpath
**This has been tested with Eclipse 3.2 up to 4.6.1. It may not work with other versions.**
The file `eclipse.classpath` is intended as a starter `.classpath` file
for building JMeter using Eclipse version 3 to 4.6.
Make sure to execute the `ant download_jars` task to download and install the jars referred
to in the classpath before creating the Eclipse project.
If you do after creating project, then don't forget to refresh Eclipse project.
Note that Eclipse is not easy to use for creating jar files.
However, it is easy to use Eclipse to run Ant.
The following targets may prove useful:
- `clean` - Clean up to force a build from source
- `package-only` - creates the jars
- `package` - compiles everything and then packages it
- `run_gui` - compiles, packages, and then start the JMeter GUI from the jars
## Invoking Ant targets inside Eclipse
You can use the `Run As --> Ant Build` and select target, or you can use
the `Windows --> Show View --> Ant View`. Then select the `build.xml` file and
drag and drop to the `Ant View`.
Now you can invoke targets by clicking on them.
Note that if you invoke for example the `compile` target, and get error
messages about
> Unable to find a javac compiler;
com.sun.tools.javac.Main is not on the classpath.
Perhaps JAVA_HOME does not point to the JDK
it just means that your Eclipse project is set up with JRE libraries instead of JDK libraries.
The suggested fix is to add a JDK in `Window --> Preferences --> Java --> Installed JREs`.
Then do a `Project --> Properties` and select `Java Build Path` in the left pane, and then
select the `Libraries` tab in the right pane. Scroll to the bottom, select the `JRE System Library`,
and click `Remove`. Then click `Add library...` , select `JRE System Library`, and then select
the JDK.
Now it should work when you invoke the `compile` target.
## Finishing the build using Ant
Find the `build.xml` file in the project,
right click on it, and click `Run As --> Ant Build`.
Make sure you select the `package` target.
This will compile any remaining classes,
and then create all the jars.
Now refresh the project (you should add this to the Ant build properties)
## Launching from Eclipse
You can use the Ant target `run_gui` to run the JMeter GUI, or you can follow the instructions
You can use the Gradle task `runGui` to run the JMeter GUI, or you can follow the instructions
below to add a Java Application launch, which will for example, allow you to use the debugger to
run JMeter.
These instructions assume you have configured Eclipse to use the classpath
as suggested in eclipse.classpath, and have run `ant package` to compile
the RMI classes and build the jars.
as suggested in [CONTRIBUTING.md](CONTRIBUTING.md).
Create a new Java Application launch configuration.
## Launching from Eclipse
On the Main tab, enter the following as the main class:
Note: you can use Gradle task `runGui` to start JMeter, however Eclipse does not support
debugging of the Gradle tasks.
> `org.apache.jmeter.NewDriver`
Alternative option is to create a `Launch Configuration`:
On the Arguments tab, in the Working Directory area, pick the radio
button next to `Other` and enter the following in the text box:
> `${workspace_loc}/jmeter/bin`
where `jmeter` is the name of the JMeter project.
**It would be nicer to use `${project_loc}/bin` but unfortunately the Eclipse Debug view does not seem to preserve any of the project variables**
1. Create a new `Java Application` launch configuration
1. Use `dist` for `Project`
1. Use `org.apache.jmeter.NewDriver` for the main class
1. On the arguments tab use the following for `Working Directory`: `${workspace_loc:jmeter/bin}`

136
gradle.md Normal file
View File

@ -0,0 +1,136 @@
# Gradle command-line
Useful commands (gw comes from https://github.com/dougborg/gdub, otherwise `./gradlew` can be used instead):
* Build and run
# Build and start JMeter GUI
gw runGui
# Build project and copy relevant jars to rootDir/lib, and start JMeter
gw createDist; ./bin/jmeter
# Build all distributions (source, binary)
gw :src:dist:assemble
* Base project info
# Display all submodules
gw projects
# Different tasks for current module
gw tasks
* Cleaning build directories
Technically speaking, `clean` should not be required (every time it is required it might be just a bug), however it might be useful to perform a "clean" build
# Cleans current project (submodule)
gw clean
# Cleans the specified project
gw :src:core:clean
* Dependencies
# Displays dependencies. Gradle's "configurations" are something like different classpaths.
gw dependencies
# Displays dependencies for all projects
gw allDependencies
# Analyze why the project depends on `org.ow2.asm:asm`
gw dependencyInsight --dependency org.ow2.asm:asm
# Verify checksums of dependencies
# Checksum verification is done by default
# Expected checksums are stored in /checksum.properties file
# Actual checksums are stored in /build/checksum/computed.checksum.properties
* Static checks
# Run RAT
gw rat
# Run checkstyle for main (non-test) code
gw checkstyleMain
# Run checkstyle for test code
gw checkstyleTest
* Compiling code
gw compileJava
gw compileTestJava
...
* Build project
# Just build jar (see build/libs/*.jar)
gw jar
# "build" is a default task to "execute all the actions"
gw build
# Test might be skipped by `-x test` (Gradle's default way to skip task by name)
gw -x test build
# Build project in parallel
gw build --parallel
* Tests
Gradle automatically tracks task dependencies, so if you modify a file in `/src/jorphan/*`, then you can just invoke `gw check` at project level or in `core` module, and Gradle will automatically build the required jars and files.
# Runs all the tests (unit tests, checkstyle, etc)
gw check
# Runs just unit tests
gw test
# Runs just core tests
gw :src:core:test
* Coverage
# Generates code coverage report for the test task to build/reports/jacoco/test/html
gw jacocoTestReport
# Generate combined coverage report
gw jacocoReport
* Generate Javadocs
# Builds javadoc to build/docs/javadoc subfolder
gw javadoc
# Builds javadoc jar to build/libs/jorphan-javadoc.jar
gw javadocJar
* Site
# Creates preview of a site to build/docs/site
gw :src:dist:previewSite
# Builds and publishes site preview to a Git repository
gw :src:dist:pushPreviewSite
* Maven
# publishes Maven artifact to local repository
gw publishToMavenLocal
# Generate all pom files
# The resulting files are placed under build/publications folder
gw generatePom
* Release artifacts
# Builds ZIP and TGZ artifacts for the release
gw :src:dist:assemble
* Signing
It is implemented via https://docs.gradle.org/5.2.1/userguide/signing_plugin.html, so it is done automatically provided credentials are specified via https://docs.gradle.org/5.2.1/userguide/signing_plugin.html#sec:signatory_credentials
# Signs all the artifacts of the current module (see results in build/**/*.asc
gw sign
# Note: signing is performed as a part of "release artifact build"
# so it will be performed with gw :src:dist:assemble
* Releasing
# Builds the project, pushes artifacts to svn://.../dev, stages artifacts to Nexus staging repository
# Note: it uses https://github.com/vlsi/asflike-release-environment, so it does not alter public repositories
gw prepareVote -Prc=1 -Pasf
# Prepare another release candidate
gw prepareVote -Prc=2 -Pasf
# Release staged artifacts to SVN and Nexus
gw publishDist -Prc=2 -Pasf

100
gradle.properties Normal file
View File

@ -0,0 +1,100 @@
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
org.gradle.parallel=true
kotlin.code.style=official
kotlin.parallel.tasks.in.project=true
# This is version for Calcite Avatica itself
# Note: it should not include "-SNAPSHOT" as it is automatically added by build.gradle.kts
# Release version can be generated by using -Prelease or -Prc=<int> arguments
jmeter.version=5.2.0
# Tools
checkstyle.version=8.22
jacoco.version=0.8.2
spotbugs.version=3.1.12
velocity.version=1.7
# Dependencies
accessors-smart.version=1.2
activemq.version=5.15.8
apache-rat.version=0.13
asm.version=7.1
bouncycastle.version=1.60
bsf.version=2.4.0
bsh.version=2.0b6
caffeine.version=2.6.2
cglib-nodep.version=3.2.9
commons-codec.version=1.11
commons-collections.version=3.2.2
commons-dbcp2.version=2.5.0
commons-io.version=2.6
commons-jexl.version=2.1.1
commons-jexl3.version=3.1
commons-lang.version=2.6
commons-lang3.version=3.8.1
commons-math3.version=3.6.1
commons-net.version=3.6
commons-pool2.version=2.6.0
commons-text.version=1.6
darcula.version=e208efb96f70e4be9dc362fbb46f6e181ef501dd
dec.version=0.1.2
dnsjava.version=2.1.8
freemarker.version=2.3.28
ftplet-api.version=1.1.1
ftpserver-core.version=1.1.1
geronimo-jms_1.1_spec.version=1.1.1
groovy-all.version=2.4.16
hamcrest-core.version=1.3
hamcrest-date.version=2.0.4
hsqldb.version=2.4.1
httpasyncclient.version=4.1.4
httpclient.version=4.5.8
httpcore-nio.version=4.4.11
httpcore.version=4.4.11
httpmime.version=4.5.8
jackson.version=2.9.9
javax.activation.version=1.2.0
jcharts.version=0.7.5
jdom.version=1.1.3
jodd.version=5.0.6
json-path.version=2.4.0
json-smart.version=2.3
jsoup.version=1.11.3
jtidy.version=r938
junit.version=4.12
log4j.version=2.11.1
mail.version=1.5.0-b01
mina-core.version=2.0.19
mongo-java-driver.version=2.11.3
objenesis.version=2.6
oro.version=2.0.8
ph-commons.version=9.2.1
ph-css.version=6.1.1
rhino.version=1.7.10
rsyntaxtextarea.version=3.0.2
Saxon-HE.version=9.9.1-1
slf4j.version=1.7.25
spock-core.version=1.2-groovy-2.4
springframework.version=4.3.17.RELEASE
tika.version=1.21
xalan.version=2.7.2
xercesImpl.version=2.12.0
xml-apis.version=1.4.01
xmlgraphics-commons.version=2.3
xmlpull.version=1.1.3.1
xpp3_min.version=1.1.4c
xstream.version=1.4.11

BIN
gradle/wrapper/gradle-wrapper.jar vendored Normal file

Binary file not shown.

View File

@ -0,0 +1,21 @@
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionSha256Sum=6c4276f97c9059ef4dfb06cc7325c43ed9b933ab04f032e9d9372e8589cb6faf
distributionUrl=https\://services.gradle.org/distributions/gradle-5.5.1-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

172
gradlew vendored Executable file
View File

@ -0,0 +1,172 @@
#!/usr/bin/env sh
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=$(save "$@")
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
cd "$(dirname "$0")"
fi
exec "$JAVACMD" "$@"

84
gradlew.bat vendored Normal file
View File

@ -0,0 +1,84 @@
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

View File

@ -1,7 +0,0 @@
This directory structure contains licenses for non-ASF software.
The bin/ directory contains license files for 3rd party jars bundled with the binary distribution
The src/ directory contains license files for 3rd party source; it also applies to the binary distribution
Note that the bin/ directory is included in the source distribution because it is needed in order to create the binary distribution

View File

@ -1,40 +1,37 @@
rat-excludes.txt
gradle/wrapper/gradle-wrapper.jar
gradlew
gradlew.bat
.*
.*/**
CODE_OF_CONDUCT.md
CONTRIBUTING.md
eclipse.md
gradle.md
ISSUE_TEMPLATE.md
PULL_REQUEST_TEMPLATE.md
README.md
**/*.jmx
bin/*.csv
bin/*.xml
bin/*.jtl
bin/examples/**
bin/report-output/**
bin/report-template/**
bin/testfiles/**
build/**
build-local.properties
dist/*.md5
dist/*.sha512
docs/**
extras/*.txt
extras/*.json
extras/Test.html
extras/Test.jtl
**/images/**
lib/aareadme.txt
lib/opt/**
licenses/bin/**
licenses/src/**
local/**
printable_docs/**
reports/**
res/META-INF/jmeter_as_ascii_art.txt
src/core/org/apache/jmeter/help.txt
lib/opt/README.txt
src/licenses/licenses/*/CC0-1.0.txt
#local/**
#printable_docs/**
#reports/**
src/launcher/src/main/resources/org/apache/jmeter/jmeter_as_ascii_art.txt
src/core/src/main/resources/org/apache/jmeter/help.txt
test/resources/**
**/*.log
**/test/resources/**
#**/*.log
**/download_jmeter.cgi
xdocs/extending/HTML_REPORT_README.TXT

112
settings.gradle.kts Normal file
View File

@ -0,0 +1,112 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
// This is the name of a current project
// Note: it cannot be inferred from the directory name as developer might clone JMeter to jmeter_tmp folder
rootProject.name = "jmeter"
include(
"src:bom",
"src:bshclient",
"src:launcher",
"src:components",
"src:config",
"src:core",
"src:examples",
"src:functions",
"src:generator",
"src:jorphan",
"src:licenses",
"src:protocol:ftp",
"src:protocol:http",
"src:protocol:java",
"src:protocol:jdbc",
"src:protocol:jms",
"src:protocol:junit",
"src:protocol:junit-sample",
"src:protocol:ldap",
"src:protocol:mail",
"src:protocol:mongodb",
"src:protocol:native",
"src:protocol:tcp",
"src:release",
"src:dist",
"src:dist-check")
// See https://github.com/gradle/gradle/issues/1348#issuecomment-284758705 and
// https://github.com/gradle/gradle/issues/5321#issuecomment-387561204
// Gradle inherits Ant "default excludes", however we do want to archive those files
org.apache.tools.ant.DirectoryScanner.removeDefaultExclude("**/.gitattributes")
org.apache.tools.ant.DirectoryScanner.removeDefaultExclude("**/.gitignore")
fun String?.toBool(nullAs: Boolean, blankAs: Boolean, default: Boolean) =
when {
this == null -> nullAs
isBlank() -> blankAs
default -> !equals("false", ignoreCase = true)
else -> equals("true", ignoreCase = true)
}
fun property(name: String) =
when(extra.has(name)) {
true -> extra.get(name) as? String
else -> null
}
if (property("localReleasePlugins").toBool(nullAs = false, blankAs = true, default = false)) {
// This enables to use local clone of vlsi-release-plugins for debugging purposes
includeBuild("../vlsi-release-plugins")
}
// Checksum plugin sources can be validated at https://github.com/vlsi/vlsi-release-plugins
buildscript {
dependencies {
classpath("com.github.vlsi.gradle:checksum-dependency-plugin:1.19.0")
// Alternative option is to use local jar file via
// classpath(files("checksum-dependency-plugin-1.19.0.jar"))
}
repositories {
gradlePluginPortal()
}
}
// Note: we need to verify the checksum for checksum-dependency-plugin itself
val expectedSha512 =
"D7B1A0C7937DCB11536F97C52FE25752BD7DA6011299E81FA59AD446A843265A6FA079ECA1D5FD49C4B3C2496A363C60C5939268BED0B722EFB8BB6787A2B193"
fun File.sha512(): String {
val md = java.security.MessageDigest.getInstance("SHA-512")
forEachBlock { buffer, bytesRead ->
md.update(buffer, 0, bytesRead)
}
return BigInteger(1, md.digest()).toString(16).toUpperCase()
}
val checksumDependencyJar: File = buildscript.configurations["classpath"].resolve().first()
val actualSha512 = checksumDependencyJar.sha512()
if (actualSha512 != expectedSha512) {
throw GradleException(
"""
Checksum mismatch for $checksumDependencyJar
Expected: $expectedSha512
Actual: $actualSha512
""".trimIndent()
)
}
apply(plugin = "com.github.vlsi.checksum-dependency")

141
src/bom/build.gradle.kts Normal file
View File

@ -0,0 +1,141 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
plugins {
`java-platform`
}
val String.v: String get() = rootProject.extra["$this.version"] as String
// Note: Gradle allows to declare dependency on "bom" as "api",
// and it makes the contraints to be transitively visible
// However Maven can't express that, so the approach is to use Gradle resolution
// and generate pom files with resolved versions
// See https://github.com/gradle/gradle/issues/9866
fun DependencyConstraintHandlerScope.apiv(
notation: String,
versionProp: String = notation.substringAfterLast(':')
) =
"api"(notation + ":" + versionProp.v)
fun DependencyConstraintHandlerScope.runtimev(
notation: String,
versionProp: String = notation.substringAfterLast(':')
) =
"runtime"(notation + ":" + versionProp.v)
dependencies {
// Parenthesis are needed here: https://github.com/gradle/gradle/issues/9248
(constraints) {
// api means "the dependency is for both compilation and runtime"
// runtime means "the dependency is only for runtime, not for compilation"
// In other words, marking dependency as "runtime" would avoid accidental
// dependency on it during compilation
runtimev("org.apache.tika:tika-parsers", "tika")
runtimev("org.codehaus.groovy:groovy-all")
runtimev("org.ow2.asm:asm")
runtimev("com.github.bulenkov.darcula:darcula")
// activemq-all should not be used as it provides secondary slf4j binding
runtimev("org.apache.activemq:activemq-broker", "activemq")
runtimev("org.apache.activemq:activemq-client", "activemq")
runtimev("org.apache.activemq:activemq-spring", "activemq")
runtimev("org.springframework:spring-context", "springframework")
runtimev("org.springframework:spring-beans", "springframework")
apiv("bsf:bsf")
apiv("cglib:cglib-nodep")
apiv("com.fasterxml.jackson.core:jackson-annotations", "jackson")
apiv("com.fasterxml.jackson.core:jackson-core", "jackson")
apiv("com.fasterxml.jackson.core:jackson-databind", "jackson")
apiv("com.fifesoft:rsyntaxtextarea")
apiv("com.github.ben-manes.caffeine:caffeine")
apiv("com.helger:ph-commons")
apiv("com.helger:ph-css")
apiv("com.jayway.jsonpath:json-path")
apiv("com.sun.activation:javax.activation", "javax.activation")
apiv("com.thoughtworks.xstream:xstream")
apiv("commons-codec:commons-codec")
apiv("commons-collections:commons-collections")
apiv("commons-io:commons-io")
apiv("commons-lang:commons-lang")
apiv("commons-net:commons-net")
apiv("dnsjava:dnsjava")
apiv("javax.activation:javax.activation-api", "javax.activation")
apiv("javax.mail:mail")
apiv("jcharts:jcharts")
apiv("junit:junit")
apiv("net.minidev:accessors-smart")
apiv("net.minidev:json-smart")
apiv("net.sf.jtidy:jtidy")
apiv("net.sf.saxon:Saxon-HE")
apiv("org.apache-extras.beanshell:bsh")
apiv("org.apache.commons:commons-dbcp2")
apiv("org.apache.commons:commons-jexl3")
apiv("org.apache.commons:commons-jexl")
apiv("org.apache.commons:commons-lang3")
apiv("org.apache.commons:commons-math3")
apiv("org.apache.commons:commons-pool2")
apiv("org.apache.commons:commons-text")
apiv("org.apache.ftpserver:ftplet-api")
apiv("org.apache.ftpserver:ftpserver-core")
apiv("org.apache.geronimo.specs:geronimo-jms_1.1_spec")
apiv("org.apache.httpcomponents:httpasyncclient")
apiv("org.apache.httpcomponents:httpclient")
apiv("org.apache.httpcomponents:httpcore-nio")
apiv("org.apache.httpcomponents:httpcore")
apiv("org.apache.httpcomponents:httpmime")
apiv("org.apache.logging.log4j:log4j-1.2-api", "log4j")
apiv("org.apache.logging.log4j:log4j-api", "log4j")
apiv("org.apache.logging.log4j:log4j-core", "log4j")
apiv("org.apache.logging.log4j:log4j-slf4j-impl", "log4j")
apiv("org.apache.mina:mina-core")
apiv("org.apache.rat:apache-rat")
apiv("org.apache.tika:tika-core", "tika")
apiv("org.apache.velocity:velocity")
apiv("org.apache.xmlgraphics:xmlgraphics-commons")
apiv("org.bouncycastle:bcmail-jdk15on", "bouncycastle")
apiv("org.bouncycastle:bcpkix-jdk15on", "bouncycastle")
apiv("org.bouncycastle:bcprov-jdk15on", "bouncycastle")
apiv("org.brotli:dec")
apiv("org.exparity:hamcrest-date")
apiv("org.freemarker:freemarker")
apiv("org.hamcrest:hamcrest-core")
apiv("org.hsqldb:hsqldb")
apiv("org.jdom:jdom")
apiv("org.jodd:jodd-core", "jodd")
apiv("org.jodd:jodd-lagarto", "jodd")
apiv("org.jodd:jodd-log", "jodd")
apiv("org.jodd:jodd-props", "jodd")
apiv("org.jsoup:jsoup")
apiv("org.mongodb:mongo-java-driver")
apiv("org.mozilla:rhino")
apiv("org.objenesis:objenesis")
apiv("org.slf4j:jcl-over-slf4j", "slf4j")
apiv("org.slf4j:slf4j-api", "slf4j")
apiv("org.spockframework:spock-core")
apiv("oro:oro")
apiv("xalan:serializer", "xalan")
apiv("xalan:xalan", "xalan")
apiv("xerces:xercesImpl")
apiv("xml-apis:xml-apis")
apiv("xmlpull:xmlpull")
apiv("xpp3:xpp3_min")
}
}

View File

@ -0,0 +1,23 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
tasks.named<Jar>(JavaPlugin.JAR_TASK_NAME) {
manifest {
attributes["Main-Class"] = "org.apache.jmeter.util.BeanShellClient"
}
}

187
src/build.gradle.kts Normal file
View File

@ -0,0 +1,187 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
val skipMavenPublication = setOf(
":src:bshclient",
":src:dist",
":src:dist-check",
":src:examples",
":src:generator",
":src:licenses",
":src:protocol",
":src:release"
)
subprojects {
if (path == ":src:bom") {
return@subprojects
}
val groovyUsed = file("src/main/groovy").isDirectory || file("src/test/groovy").isDirectory
val testsPresent = file("src/test").isDirectory
apply<JavaLibraryPlugin>()
if (groovyUsed) {
apply<GroovyPlugin>()
}
apply<MavenPublishPlugin>()
apply<JacocoPlugin>()
dependencies {
if (!testsPresent) {
// No tests => no dependencies required
return@dependencies
}
val testImplementation by configurations
val testRuntimeOnly by configurations
testImplementation("junit:junit")
if (groovyUsed) {
testImplementation("org.spockframework:spock-core")
}
testRuntimeOnly("cglib:cglib-nodep:3.2.9") {
because("""
org.spockframework.mock.CannotCreateMockException: Cannot create mock for
class org.apache.jmeter.report.processor.AbstractSummaryConsumer${'$'}SummaryInfo.
Mocking of non-interface types requires a code generation library.
Please put an up-to-date version of byte-buddy or cglib-nodep on the class path.""".trimIndent())
}
testRuntimeOnly("org.objenesis:objenesis") {
because("""
org.spockframework.mock.CannotCreateMockException: Cannot create mock for
class org.apache.jmeter.report.core.Sample. To solve this problem,
put Objenesis 1.2 or higher on the class path (recommended),
or supply constructor arguments (e.g. 'constructorArgs: [42]') that allow to construct
an object of the mocked type.""".trimIndent())
}
}
// Note: jars below do not normalize line endings.
// Those jars, however are not included to source/binary distributions
// so the normailzation is not that important
val sourcesJar by tasks.registering(Jar::class) {
val sourceSets: SourceSetContainer by project
from(sourceSets["main"].allJava)
archiveClassifier.set("sources")
}
val javadocJar by tasks.registering(Jar::class) {
from(tasks.named(JavaPlugin.JAVADOC_TASK_NAME))
archiveClassifier.set("javadoc")
}
val testClasses by configurations.creating {
extendsFrom(configurations["testRuntime"])
}
if (testsPresent) {
// Do not generate test jars when src/test folder is missing (e.g. "config.jar")
val testJar by tasks.registering(Jar::class) {
val sourceSets: SourceSetContainer by project
archiveClassifier.set("test")
from(sourceSets["test"].output)
}
// Parenthesis needed to use Project#getArtifacts
(artifacts) {
testClasses(testJar)
}
}
val archivesBaseName = when (name) {
"jorphan", "bshclient" -> name
"launcher" -> "ApacheJMeter"
else -> "ApacheJMeter_$name"
}
setProperty("archivesBaseName", archivesBaseName)
// See https://stackoverflow.com/a/53661897/1261287
// Subprojects can't use "publishing" since that accessor is not available at parent project
// evaluation time
configure<PublishingExtension> {
if (project.path in skipMavenPublication) {
return@configure
}
publications {
create<MavenPublication>(project.name) {
artifactId = archivesBaseName
version = rootProject.version.toString()
from(components["java"])
// Eager task creation is required due to
// https://github.com/gradle/gradle/issues/6246
artifact(sourcesJar.get())
artifact(javadocJar.get())
// Use the resolved versions in pom.xml
// Gradle might have different resolution rules, so we set the versions
// that were used in Gradle build/test.
versionMapping {
usage(Usage.JAVA_RUNTIME) {
fromResolutionResult()
}
usage(Usage.JAVA_API) {
fromResolutionOf("runtimeClasspath")
}
}
pom {
withXml {
val sb = asString()
var s = sb.toString()
// <scope>compile</scope> is Maven default, so delete it
s = s.replace("<scope>compile</scope>", "")
// Cut <dependencyManagement> because all dependencies have the resolved versions
s = s.replace(
Regex(
"<dependencyManagement>.*?</dependencyManagement>",
RegexOption.DOT_MATCHES_ALL
),
""
)
sb.setLength(0)
sb.append(s)
// Re-format the XML
asNode()
}
name.set("Apache JMeter ${project.name.capitalize()}")
description.set(project.description)
inceptionYear.set("1998")
url.set("http://jmeter.apache.org/")
licenses {
license {
name.set("The Apache License, Version 2.0")
url.set("http://www.apache.org/licenses/LICENSE-2.0.txt")
comments.set("A business-friendly OSS license")
}
}
issueManagement {
system.set("bugzilla")
url.set("https://bz.apache.org/bugzilla/describecomponents.cgi?product=JMeter")
}
scm {
connection.set("scm:git:https://gitbox.apache.org/repos/asf/jmeter.git")
developerConnection.set("scm:git:https://gitbox.apache.org/repos/asf/jmeter.git")
url.set("https://github.com/apache/jmeter")
tag.set("HEAD")
}
}
}
}
}
}

View File

@ -0,0 +1,94 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
dependencies {
api(project(":src:core"))
testCompile(project(":src:core", "testClasses"))
api("org.apache-extras.beanshell:bsh:2.0b6") {
because("""
BeanShell is not required for JMeter, however it is commonly used in the jmx scripts.
New scripts should refrain from using BeanShell though and migrate to Groovy or other
faster engines
""".trimIndent())
}
api("javax.mail:mail:1.5.0-b01") {
exclude("javax.activation", "activation")
}
// There's no javax.activation:activation:1.2.0, so we use com.sun...
runtimeOnly("com.sun.activation:javax.activation")
// This is an API-only jar. javax.activation is present in Java 8,
// however it is not there in Java 9
compileOnly("javax.activation:javax.activation-api")
implementation("com.github.ben-manes.caffeine:caffeine")
implementation("jcharts:jcharts")
implementation("oro:oro")
implementation("net.minidev:json-smart")
implementation("net.minidev:accessors-smart")
implementation("org.apache.commons:commons-pool2")
implementation("commons-codec:commons-codec")
implementation("org.jodd:jodd-log")
implementation("org.jodd:jodd-lagarto")
implementation("com.jayway.jsonpath:json-path")
implementation("org.apache.httpcomponents:httpasyncclient")
implementation("org.apache.httpcomponents:httpcore-nio")
implementation("org.jsoup:jsoup")
implementation("org.apache.commons:commons-lang3")
implementation("net.sf.jtidy:jtidy")
implementation("commons-collections:commons-collections")
implementation("org.apache.commons:commons-math3")
implementation("commons-io:commons-io") {
because("IOUtils")
}
implementation("org.apache.commons:commons-text") {
because("StringEscapeUtils")
}
// we use bcmail for compilation only, and bcmail is not shipped in the release
compileOnly("org.bouncycastle:bcmail-jdk15on")
compileOnly("org.bouncycastle:bcpkix-jdk15on")
compileOnly("org.bouncycastle:bcprov-jdk15on")
// Certain tests use bouncycastle, so it is added to test classpath
testRuntimeOnly("org.bouncycastle:bcmail-jdk15on")
testRuntimeOnly("org.bouncycastle:bcpkix-jdk15on")
testRuntimeOnly("org.bouncycastle:bcprov-jdk15on")
}
fun String?.toBool(nullAs: Boolean, blankAs: Boolean, default: Boolean) =
when {
this == null -> nullAs
isBlank() -> blankAs
default -> !equals("false", ignoreCase = true)
else -> equals("true", ignoreCase = true)
}
if (!(project.findProperty("enableJavaFx") as? String)
.toBool(nullAs = false, blankAs = true, default = false)
) {
// JavaFX is not present in Maven Central, so exclude the file unless explicitly asked by
// -PenableJavaFx
logger.debug("RenderInBrowser is excluded from compilation. If you want to compile it, add -PenableJavaFx")
sourceSets {
main {
java {
exclude("org/apache/jmeter/visualizers/RenderInBrowser.java")
}
}
}
}

View File

@ -0,0 +1,82 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
import com.github.vlsi.gradle.crlf.CrLfSpec
import com.github.vlsi.gradle.crlf.LineEndings
import com.github.vlsi.gradle.release.dsl.dependencyLicenses
import com.github.vlsi.gradle.release.dsl.licensesCopySpec
plugins {
id("com.github.vlsi.crlf")
}
// Project :src:license-* might not be evaluated yet, so "renderLicenseFor..." task
// might not exist yet
// So we add "evaluationDependsOn"
evaluationDependsOn(":src:licenses")
// This workarounds https://github.com/gradle/gradle/issues/10008
// Gradle does not support CopySpec#with(Provider<CopySpec>) yet :(
fun licenses(licenseType: String) =
project(":src:licenses").tasks.named("renderLicenseFor${licenseType.capitalize()}")
.let { task ->
licensesCopySpec(task) {
from(task)
from("$rootDir/NOTICE")
}
}
val sourceLicense = licenses("source")
tasks.named<Jar>(JavaPlugin.JAR_TASK_NAME) {
into("META-INF") {
// License file should include licenses for bundled third-party components
CrLfSpec(LineEndings.LF).run {
// Note: license content is taken from "/build/..", so gitignore should not be used
// Note: this is a "license + third-party licenses", not just Apache-2.0
dependencyLicenses(sourceLicense)
}
}
into("run") {
filteringCharset = "UTF-8"
CrLfSpec(LineEndings.LF).run {
textFrom("$rootDir/bin") {
text("*.bshrc")
text("*.groovy")
text("*.parameters")
text("*.properties")
text("*.groovy")
text("jaas.conf")
text("krb5.conf")
text("log4j2.xml")
binary("proxyserver.jks")
text("users.dtd")
text("users.xml")
}
into("templates") {
textFrom("templates/templates.dtd")
}
into("report-template") {
textFrom("$rootDir/bin/report-template") {
text("**/*") // all except binary
binary("**/*.png", "**/*.ttf", "**/*.woff", "**/*.woff2", "**/*.eot", "**/*.otf")
}
}
}
}
}

119
src/core/build.gradle.kts Normal file
View File

@ -0,0 +1,119 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
plugins {
id("com.github.vlsi.ide")
}
dependencies {
api(project(":src:launcher"))
api(project(":src:jorphan"))
testCompile(project(":src:jorphan", "testClasses"))
api("bsf:bsf") {
because("protected BSFManager BSFTestElement#getManager()")
}
api("com.fifesoft:rsyntaxtextarea") {
because("JSyntaxTextArea extends RSyntaxTextArea")
}
api("net.sf.jtidy:jtidy") {
because("public static Tidy XPathUtil#makeTidyParser()")
}
api("com.thoughtworks.xstream:xstream") {
because("XStream in used in public API")
}
api("org.apache.logging.log4j:log4j-1.2-api")
api("org.apache.logging.log4j:log4j-api")
api("org.apache.logging.log4j:log4j-core") {
because("GuiLogEventAppender is using log4j-core to implement GUI-based log appender")
}
api("org.apache.logging.log4j:log4j-slf4j-impl") {
because("Both log4j and slf4j are included, so it makes sense to just add log4j->slf4j bridge as well")
}
api("oro:oro") {
because("Perl5Matcher org.apache.jmeter.util.JMeterUtils.getMatcher()")
}
api("xalan:xalan") {
because("PropertiesBasedPrefixResolver extends PrefixResolverDefault")
}
// Note: Saxon should go AFTER xalan so xalan XSLT is used
// org.apache.jmeter.util.XPathUtilTest.testFormatXmlSimple assumes xalan transformer
api("net.sf.saxon:Saxon-HE") {
because("XPathUtil: throws SaxonApiException")
}
runtimeOnly("org.codehaus.groovy:groovy-all") {
because("Groovy is a default JSR232 engine")
}
implementation("org.slf4j:jcl-over-slf4j")
implementation("commons-codec:commons-codec") {
because("DigestUtils")
}
implementation("commons-collections:commons-collections")
implementation("com.github.ben-manes.caffeine:caffeine")
implementation("com.fasterxml.jackson.core:jackson-annotations")
implementation("com.fasterxml.jackson.core:jackson-core")
implementation("com.fasterxml.jackson.core:jackson-databind")
implementation("org.freemarker:freemarker")
implementation("org.mozilla:rhino")
implementation("org.apache.xmlgraphics:xmlgraphics-commons")
implementation("org.apache.commons:commons-text")
implementation("org.apache.commons:commons-math3") {
because("Mean, DescriptiveStatistics")
}
// For some reason JMeter bundles just tika-core and tika-parsers without transitive
// dependencies. So we exclude those
implementation("org.apache.tika:tika-core") {
isTransitive = false
}
runtimeOnly("org.apache.tika:tika-parsers") {
isTransitive = false
}
implementation("org.jodd:jodd-core")
implementation("org.jodd:jodd-props")
// TODO: JMeter bundles Xerces, however the reason is unknown
runtimeOnly("xerces:xercesImpl")
runtimeOnly("xml-apis:xml-apis")
testImplementation("commons-net:commons-net")
testRuntimeOnly("org.spockframework:spock-core")
}
val generatedVersionDir = File(buildDir, "generated/sources/version")
val versionClass by tasks.registering(Sync::class) {
val lastEditYear: String by rootProject.extra
val displayVersion: String by rootProject.extra
inputs.property("@VERSION@", displayVersion)
inputs.property("@YEAR@", lastEditYear)
outputs.dir(generatedVersionDir)
from("$projectDir/src/main/version") {
include("**/*.java")
filter { x: String ->
x.replace("@VERSION@", displayVersion)
.replace("@YEAR@", lastEditYear)
}
}
into(generatedVersionDir)
}
ide {
generatedJavaSources(versionClass.get(), generatedVersionDir)
}

View File

@ -1,106 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
/*
* Created on 02-Oct-2003
*
* This class defines the JMeter version only (moved from JMeterUtils)
*
* Version changes no longer change the JMeterUtils source file
* - easier to spot when JMeterUtils really changes
* - much smaller to download when the version changes
*
*/
package org.apache.jmeter.util;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Properties;
import org.apache.commons.io.IOUtils;
/**
* Utility class to define the JMeter Version string
*
*/
public final class JMeterVersion {
/*
*
* The string is made private so the compiler can't propagate it into
* JMeterUtils. (Java compilers may make copies of final variables)
*
* This ensures that JMeterUtils always gets the correct
* version, even if JMeterUtils is not re-compiled during the build.
*/
private static final String VERSION = "5.2-SNAPSHOT";
private static final String IMPLEMENTATION;
// Same applies to copyright string
private static final String COPYRIGHT = "Copyright (c) 1998-2019 The Apache Software Foundation";
static {
String impl=null;
final Class<?> myClass = JMeterVersion.class;
// This assumes that the JVM treats a class file as a resource (not all do).
URL resource = myClass.getResource("JMeterVersion.class");
// For example:
// jar:file:/JMeter/lib/ext/ApacheJMeter_core.jar!/org/apache/jmeter/util/JMeterVersion.class
// or if using an IDE
// file:/workspaces/JMeter/build/core/org/apache/jmeter/util/JMeterVersion.class
try {
// Convert to URL for manifest
String url = resource.toString().replaceFirst("!/.+", "!/META-INF/MANIFEST.MF");
resource=new URL(url);
InputStream inputStream = resource.openStream();
if (inputStream != null) {
Properties props = new Properties();
try {
props.load(inputStream);
impl = props.getProperty("Implementation-Version");
} finally {
IOUtils.closeQuietly(inputStream);
}
}
} catch (IOException ioe) {
// Ignored
}
if (impl == null) {
IMPLEMENTATION = VERSION; // default to plain version
} else {
IMPLEMENTATION = impl;
}
}
private JMeterVersion() // Not instantiable
{
super();
}
static String getVERSION() {
return IMPLEMENTATION;
}
public static String getCopyRight() {
return COPYRIGHT;
}
}

View File

@ -0,0 +1,36 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.jmeter.util;
/**
* Utility class to define the JMeter Version string.
* Note: @...@-like macroses in this file should be replaced by a Gradle task.
*/
public final class JMeterVersion {
private JMeterVersion() {
}
static String getVERSION() {
return "@VERSION@";
}
public static String getCopyRight() {
return "Copyright (c) 1998-@YEAR@ The Apache Software Foundation";
}
}

View File

@ -18,6 +18,7 @@ package org.apache.jmeter.testbeans.gui;
import static org.junit.Assert.assertEquals;
import org.apache.jmeter.util.JMeterUtils;
import org.junit.Test;
public class TestFieldStringEditor {
@ -28,6 +29,7 @@ public class TestFieldStringEditor {
}
private void testSetGetAsText(ComboStringEditor e, String text) throws Exception {
System.out.println("JMeterUtils.getJMeterVe rsion() = " + JMeterUtils.getJMeterVersion());
e.setAsText(text);
assertEquals(text, e.getAsText());
}

View File

@ -0,0 +1,221 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
import org.apache.jmeter.buildtools.batchtest.BatchTest
import org.apache.jmeter.buildtools.batchtest.BatchTestServer
plugins {
jmeterbuild.batchtest
}
val extraTestDependencies by configurations.creating
val loggingClasspath by configurations.creating
dependencies {
api(project(":src:dist"))
testCompile(project(":src:dist", "testClasses"))
testImplementation("org.apache.commons:commons-lang3") {
because("StringUtils")
}
testImplementation("commons-io:commons-io") {
because("IOUtils")
}
testImplementation("com.fasterxml.jackson.core:jackson-databind") {
because("It is used in ReportGeneratorSpec and HtmlReportGeneratorSpec")
}
extraTestDependencies(platform(project(":src:bom")))
extraTestDependencies("org.hsqldb:hsqldb")
extraTestDependencies("org.apache.mina:mina-core")
extraTestDependencies("org.apache.ftpserver:ftplet-api")
extraTestDependencies("org.apache.ftpserver:ftpserver-core")
// activemq-all should not be used as it provides secondary slf4j binding
extraTestDependencies("org.apache.activemq:activemq-broker")
extraTestDependencies("org.apache.activemq:activemq-client")
extraTestDependencies("org.apache.activemq:activemq-spring")
extraTestDependencies("org.springframework:spring-context")
extraTestDependencies("org.springframework:spring-beans")
// extraTestDependencies("com.fasterxml.jackson.core:jackson-annotations")
extraTestDependencies("org.apache.commons:commons-pool2")
// Slf4j is used by activemq and mina, so slf4j binding must be placed on the top-level
// classpath since extraTestDependencies is added to the classpath
// This is not required for regular ./bin/jmeter because activemq/mina is not on the top-level
// classpath but all the jars are loaded by a custom classloader which is instantiated by NewDriver
// TODO: implement "extra classpath folder" in DynamicClassLoader
loggingClasspath(platform(project(":src:bom")))
loggingClasspath("org.slf4j:jcl-over-slf4j")
loggingClasspath("org.apache.logging.log4j:log4j-api")
loggingClasspath("org.apache.logging.log4j:log4j-core")
loggingClasspath("org.apache.logging.log4j:log4j-1.2-api")
loggingClasspath("org.apache.logging.log4j:log4j-slf4j-impl")
}
val libOpt = copySpec {
// Extra dependencies for testing purposes, to be placed in lib/opt
}
val populateLibs by tasks.registering {
dependsOn(extraTestDependencies)
doLast {
val deps = extraTestDependencies.resolvedConfiguration.resolvedArtifacts
with(libOpt) {
fileMode = "644".toInt(8)
dirMode = "755".toInt(8)
from(deps.map { it.file })
}
}
}
// Add dependency from libOpt to populateLibs
libOpt.from(populateLibs)
// For now lib/opt is hard-coded in some of the JMX files
val extraTestJarsDir = rootProject.layout.projectDirectory.dir("lib").dir("opt")
val createDist by project(":src:dist").tasks.existing(Task::class)
val copyExtraTestLibs by tasks.registering(Sync::class) {
dependsOn(createDist)
into(extraTestJarsDir)
with(libOpt)
preserve {
include("README.txt")
}
}
val detailBatchTasks = findProperty("allBatch") is String
val batchTests by tasks.registering() {
group = LifecycleBasePlugin.VERIFICATION_GROUP
description = "Executes all the batch tests" +
if (detailBatchTasks) "" else " (add -PallBatch to see individual batch tasks)"
}
val jacoco = project.extensions.findByType<JacocoPluginExtension>()
inline fun <reified T : BatchTest> createBatchTask(
name: String,
suffix: String = "",
noinline action: (T.() -> Unit)? = null
) =
tasks.register("batch" + (if (T::class == BatchTestServer::class) "Server" else "") +
name.capitalize() + suffix.capitalize(), T::class) {
group = when {
detailBatchTasks -> LifecycleBasePlugin.VERIFICATION_GROUP
else -> ""
}
testName.set(name)
dependsOn(copyExtraTestLibs)
// Log4j must be on the classpath because NewDriver initializes logging
classpath(loggingClasspath)
classpath(extraTestJarsDir.asFileTree.matching { include("*.jar") })
jacoco?.applyTo(this)
if (action != null) {
action()
}
}.also {
batchTests.configure {
dependsOn(it)
}
}
fun createBatchTestTask(name: String, suffix: String = "", action: (BatchTest.() -> Unit)? = null) =
createBatchTask(name, suffix, action)
fun createBatchServerTestTask(name: String, suffix: String = "", action: (BatchTestServer.() -> Unit)? = null) =
createBatchTask(name, suffix, action)
arrayOf(
"BatchTestLocal",
"Bug52310",
"Bug62239", "Bug52968", "Bug50898",
"Bug56243",
// StackOverflowError with ModuleController in Non-GUI mode if its name is the same as the target node
"Bug55375",
"Bug56811",
"TEST_HTTPS",
"TestCookieManager",
"JMS_TESTS",
"OS_TESTS",
"Bug60607",
"TestKeepAlive",
"ResponseDecompression",
"TestSchedulerWithTimer",
"Http4ImplPreemptiveBasicAuth",
"Http4ImplDigestAuth",
"BUG_62847",
"HTMLParserTestFile_2",
"TestResultStatusAction",
"TestRedirectionPolicies"
).map { createBatchTestTask(it) }
// Certain errors are expected in those tests as they examine failure cases as well
arrayOf(
"TCP_TESTS",
"FTP_TESTS",
"JDBC_TESTS"
).map {
createBatchTestTask(it) {
ignoreErrorLogs.set(true)
}
}
createBatchTestTask("Bug54685") {
jmeterArgument("sample_variables", "REFERENCE,JSESSIONID")
}
createBatchTestTask("Http4ImplPreemptiveBasicAuth", "Java") {
jmeterArgument("jmeter.httpsampler", "Java")
}
for (impl in arrayOf("Java", "HttpClient4")) {
createBatchTestTask("SlowCharsFeature", impl) {
csvFile.set(outputDirectory.file("${testName.get()}_$impl.csv"))
xmlFile.set(outputDirectory.file("${testName.get()}_$impl.xml"))
jmeterArgument("jmeter.httpsampler", impl)
}
createBatchTestTask("TestHeaderManager", impl) {
jmeterArgument("jmeter.httpsampler", impl)
}
createBatchTestTask("TEST_HTTP", impl) {
jmeterArgument("jmeter.httpsampler", impl)
csvFile.set(outputDirectory.file("${testName.get()}_$impl.csv"))
xmlFile.set(outputDirectory.file("${testName.get()}_$impl.xml"))
if (impl == "Java") {
ignoreErrorLogs.set(true)
}
}
}
// Note: original build.xml seem to use Bug54685 test, however in fact batchtestserver target
// just ignored the given filename
createBatchServerTestTask("BatchTestLocal")
tasks.named(JavaPlugin.TEST_TASK_NAME).configure {
// Test examine JAR contents in /lib/..., so we need to copy jars to the projectRoot/lib/
dependsOn(createDist)
// This is a convenience, so batch tests are executed as a part of default "test" task
dependsOn(batchTests)
}

484
src/dist/build.gradle.kts vendored Normal file
View File

@ -0,0 +1,484 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
import com.github.vlsi.gradle.release.ReleaseExtension
import com.github.vlsi.gradle.crlf.CrLfSpec
import com.github.vlsi.gradle.crlf.LineEndings
import com.github.vlsi.gradle.release.dsl.*
import com.github.vlsi.gradle.git.FindGitAttributes
import com.github.vlsi.gradle.git.dsl.*
import org.gradle.api.internal.TaskOutputsInternal
plugins {
id("com.github.vlsi.crlf")
id("com.github.vlsi.stage-vote-release")
}
var jars = arrayOf(
":src:bshclient",
":src:launcher",
":src:components",
":src:core",
//":src:examples",
":src:functions",
":src:jorphan",
":src:protocol:ftp",
":src:protocol:http",
":src:protocol:java",
":src:protocol:jdbc",
":src:protocol:jms",
":src:protocol:junit",
":src:protocol:ldap",
":src:protocol:mail",
":src:protocol:mongodb",
":src:protocol:native",
":src:protocol:tcp")
val buildDocs by configurations.creating
// Note: you can inspect final classpath (list of jars in the binary distribution) via
// gw dependencies --configuration runtimeClasspath
dependencies {
for (p in jars) {
api(project(p))
testCompile(project(p, "testClasses"))
}
runtimeOnly("com.github.bulenkov.darcula:darcula") {
because("""
It just looks good, however Darcula is not used explicitly,
so the dependency is added for distribution only""".trimIndent())
}
buildDocs(platform(project(":src:bom")))
buildDocs("org.apache.velocity:velocity")
buildDocs("commons-lang:commons-lang")
buildDocs("commons-collections:commons-collections")
buildDocs("org.jdom:jdom")
}
tasks.named(BasePlugin.CLEAN_TASK_NAME).configure {
doLast {
// createDist can't yet remove outdated jars (e.g. when dependency is updated to a newer version)
// so we enhance "clean" task to kill the jars
delete(fileTree("$rootDir/bin") { include("ApacheJMeter.jar") })
delete(fileTree("$rootDir/lib") { include("*.jar") })
delete(fileTree("$rootDir/lib/ext") { include("ApacheJMeter*.jar") })
}
}
// Libs are populated dynamically since we can't get the full set of dependencies
// before we execute all the build scripts
val libs = copySpec {
// Third-party dependencies + jorphan.jar
}
val libsExt = copySpec {
// Apache JMeter jars
}
val binLibs = copySpec {
// ApacheJMeter.jar launcher
}
// Splits jar dependencies to "lib", "lib/ext", and "bin" folders
val populateLibs by tasks.registering {
dependsOn(configurations.runtimeClasspath)
doLast {
val deps = configurations.runtimeClasspath.get().resolvedConfiguration.resolvedArtifacts
// This ensures project exists, if project is renamed, names should be corrected here as wells
val launcherProject = project(":src:launcher").path
val bshclientProject = project(":src:bshclient").path
val jorphanProject = project(":src:jorphan").path
listOf(libs, libsExt, binLibs).forEach {
it.fileMode = "644".toInt(8)
it.dirMode = "755".toInt(8)
}
for (dep in deps) {
val compId = dep.id.componentIdentifier
// The path is "relative" to rootDir/lib
when (compId) {
is ProjectComponentIdentifier ->
(when (compId.projectPath) {
launcherProject -> binLibs
jorphanProject, bshclientProject -> libs
else -> libsExt
}).from(dep.file) {
// Technically speaking, current JMeter artifacts do not have version in the name
// however rename is here just in case
rename { dep.name + "." + dep.extension }
}
else -> libs.from(dep.file)
}
}
}
}
// This adds dependency on "populateLibs" task
// This makes uses of these copySpecs transparently depend on the builder task
libs.from(populateLibs)
libsExt.from(populateLibs)
binLibs.from(populateLibs)
val copyLibs by tasks.registering(Copy::class) {
val junitSampleJar = project(":src:protocol:junit-sample").tasks.named(JavaPlugin.JAR_TASK_NAME)
dependsOn(junitSampleJar)
val generatorJar = project(":src:generator").tasks.named(JavaPlugin.JAR_TASK_NAME)
// Can't use $rootDir since Gradle somehow reports .gradle/caches/ as "always modified"
rootSpec.into("$rootDir/lib")
with(libs)
into("ext") {
with(libsExt)
from(generatorJar)
}
into("junit") {
from(junitSampleJar) {
rename { "test.jar" }
}
}
}
val copyBinLibs by tasks.registering(Copy::class) {
// Can't use $rootDir since Gradle somehow reports .gradle/caches/ as "always modified"
rootSpec.into("$rootDir/bin")
with(binLibs)
}
val createDist by tasks.registering {
group = LifecycleBasePlugin.BUILD_GROUP
description = "Copies JMeter jars and dependencies to projectRoot/lib/ folder"
dependsOn(copyLibs)
dependsOn(copyBinLibs)
}
// This task scans the project for gitignore / gitattributes, and that is reused for building
// source/binary artifacts with the appropriate eol/executable file flags
val gitProps by rootProject.tasks.existing(FindGitAttributes::class)
// Project :src:license-* might not be evaluated yet, so "renderLicenseFor..." task
// might not exist yet
// So we add "evaluationDependsOn"
evaluationDependsOn(":src:licenses")
// This workarounds https://github.com/gradle/gradle/issues/10008
// Gradle does not support CopySpec#with(Provider<CopySpec>) yet :(
fun licenses(licenseType: String) =
licensesCopySpec(
project(":src:licenses")
.tasks.named("renderLicenseFor${licenseType.capitalize()}"))
val sourceLicense = licenses("source")
val binaryLicense = licenses("binary")
fun createAnakiaTask(taskName: String,
baseDir: String, extension: String = ".html", style: String,
velocityProperties: String, projectFile: String, excludes: Array<String>,
includes: Array<String>): TaskProvider<Task> {
val outputDir = "$buildDir/docs/$taskName"
val prepareProps = tasks.register("prepareProperties$taskName") {
// AnakiaTask can't use relative paths, and it forbids ../, so we create a dedicated
// velocity.properties file that contains absolute path
inputs.file(velocityProperties)
val outputProps = "$buildDir/docProps/$taskName/velocity.properties"
outputs.file(outputProps)
doLast {
val p = `java.util`.Properties()
file(velocityProperties).reader().use {
p.load(it)
}
p["resource.loader"] = "file"
p["file.resource.loader.path"] = baseDir
p["file.resource.loader.class"] = "org.apache.velocity.runtime.resource.loader.FileResourceLoader"
file(outputProps).apply {
parentFile.run { isDirectory || mkdirs() } || throw IllegalStateException("Unable to create directory $parentFile")
writer().use {
p.store(it, "Auto-generated from $velocityProperties to pass absolute path to Velocity")
}
}
}
}
return tasks.register(taskName) {
inputs.file("$baseDir/$style")
inputs.file("$baseDir/$projectFile")
inputs.files(fileTree(baseDir) {
include(*includes)
exclude(*excludes)
})
inputs.properties["extension"] = extension
outputs.dir(outputDir)
dependsOn(prepareProps)
doLast {
ant.withGroovyBuilder {
"taskdef"("name" to "anakia",
"classname" to "org.apache.velocity.anakia.AnakiaTask",
"classpath" to buildDocs.asPath)
"anakia"("basedir" to baseDir,
"destdir" to outputDir,
"extension" to extension,
"style" to style,
"projectFile" to projectFile,
"excludes" to excludes.joinToString(" "),
"includes" to includes.joinToString(" "),
"lastModifiedCheck" to "true",
"velocityPropertiesFile" to prepareProps.get().outputs.files.singleFile)
}
}
}
}
val xdocs = "$rootDir/xdocs"
fun CopySpec.docCssAndImages() {
from(xdocs) {
include("css/**")
include("images/**")
}
}
fun CopySpec.manuals() {
from(xdocs) {
include("demos/**")
include("extending/jmeter_tutorial.pdf")
include("usermanual/**/*.pdf")
}
}
fun CopySpec.printableDocumentation() {
into("docs") {
docCssAndImages()
}
into("printable_docs") {
from(buildPrintableDoc)
manuals()
}
}
val buildPrintableDoc = createAnakiaTask("buildPrintableDoc", baseDir = xdocs,
style = "stylesheets/site_printable.vsl",
velocityProperties = "$xdocs/velocity.properties",
projectFile = "stylesheets/printable_project.xml",
excludes = arrayOf("**/stylesheets/**", "extending.xml", "extending/*.xml"),
includes = arrayOf("**/*.xml"))
val previewPrintableDocs by tasks.registering(Copy::class) {
group = JavaBasePlugin.DOCUMENTATION_GROUP
description = "Creates preview of a printable documentation to build/docs/printable_preview"
into("$buildDir/docs/printable_preview")
CrLfSpec().run {
gitattributes(gitProps)
printableDocumentation()
}
}
val lastEditYear: String by rootProject.extra
fun xslt(subdir: String,
outputDir: String,
includes: Array<String> = arrayOf("*.xml"),
excludes: Array<String> = arrayOf("extending.xml")) {
val relativePath = if (subdir.isEmpty()) "." else ".."
ant.withGroovyBuilder {
"xslt"("style" to "$xdocs/stylesheets/website-style.xsl",
"basedir" to "$xdocs/$subdir",
"destdir" to "$outputDir/$subdir",
"excludes" to excludes.joinToString(" "),
"includes" to includes.joinToString(" ")
) {
"param"("name" to "relative-path", "expression" to relativePath)
"param"("name" to "subdir", "expression" to subdir)
"param"("name" to "year", "expression" to lastEditYear)
}
}
}
val processSiteXslt by tasks.registering {
val outputDir = "$buildDir/siteXslt"
inputs.files(xdocs)
inputs.properties["year"] = lastEditYear
outputs.dir(outputDir)
doLast {
for(f in (outputs as TaskOutputsInternal).previousOutputFiles) {
f.delete()
}
for(i in arrayOf("", "usermanual", "localising")) {
xslt(i, outputDir)
}
}
}
fun CopySpec.siteLayout() {
// TODO: generate doap_JMeter.rdf
from("$xdocs/download_jmeter.cgi")
into("api") {
javadocs()
}
from(processSiteXslt)
docCssAndImages()
manuals()
}
val previewSite by tasks.registering(Copy::class) {
group = JavaBasePlugin.DOCUMENTATION_GROUP
description = "Creates preview of a site to build/docs/site"
into("$buildDir/site")
CrLfSpec().run {
gitattributes(gitProps)
siteLayout()
}
}
val distributionGroup = "distribution"
val baseFolder = "apache-jmeter-${rootProject.version}"
fun CopySpec.javadocs() = from(javadocAggregate)
fun CopySpec.excludeLicenseFromSourceRelease() {
// Source release has "/licenses" folder with licenses for third-party dependencies
// It is populated by "dependencyLicenses" above,
// so we ignore the folder when building source releases
exclude("licenses/**")
exclude("LICENSE")
}
fun CrLfSpec.binaryLayout() = copySpec {
gitattributes(gitProps)
into(baseFolder) {
// Note: license content is taken from "/build/..", so gitignore should not be used
// Note: this is a "license + third-party licenses", not just Apache-2.0
dependencyLicenses(binaryLicense)
from(rootDir) {
gitignore(gitProps)
exclude("bin/testfiles")
include("bin/**")
include("lib/ext/**")
include("lib/junit/**")
include("extras/**")
include("README.md")
excludeLicenseFromSourceRelease()
}
into("bin") {
with(binLibs)
}
into("lib") {
with(libs)
into("ext") {
with(libsExt)
}
}
printableDocumentation()
into("docs/api") {
javadocs()
}
}
}
fun CrLfSpec.sourceLayout() = copySpec {
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
gitattributes(gitProps)
into(baseFolder) {
// Note: license content is taken from "/build/..", so gitignore should not be used
// Note: this is a "license + third-party licenses", not just Apache-2.0
dependencyLicenses(sourceLicense)
// Include all the source files
from(rootDir) {
gitignore(gitProps)
excludeLicenseFromSourceRelease()
}
}
}
val javadocAggregate by tasks.registering(Javadoc::class) {
group = JavaBasePlugin.DOCUMENTATION_GROUP
description = "Generates aggregate javadoc for all the artifacts"
val sourceSets = jars.map { project(it).sourceSets.main }
classpath = files(sourceSets.map { set -> set.map { it.output + it.compileClasspath } })
// Aggregate javadoc needs to include generated JMeterVersion class
// So we use delay computation of source files
setSource(sourceSets.map { set -> set.map { it.allJava } })
setDestinationDir(file("$buildDir/docs/javadocAggregate"))
}
val skipDist: Boolean by rootProject.extra
// Generates distZip, distTar, distZipSource, and distTarSource tasks
// The archives and checksums are put to build/distributions
for (type in listOf("binary", "source")) {
if (skipDist) {
break
}
for (archive in listOf(Zip::class, Tar::class)) {
val taskName = "dist${archive.simpleName}${type.replace("binary", "").capitalize()}"
val archiveTask = tasks.register(taskName, archive) {
val eol = if (archive == Tar::class) LineEndings.LF else LineEndings.CRLF
group = distributionGroup
description = "Creates $type distribution with $eol line endings for text files"
if (this is Tar) {
compression = Compression.GZIP
}
// Gradle does not track "filters" as archive/copy task dependencies,
// So a mere change of a file attribute won't trigger re-execution of a task
// So we add a custom property to re-execute the task in case attributes change
inputs.property("gitproperties", gitProps.map { it.props.attrs.toString() })
// Gradle defaults to the following pattern, and JMeter was using apache-jmeter-5.1_src.zip
// [baseName]-[appendix]-[version]-[classifier].[extension]
archiveBaseName.set("apache-jmeter-${rootProject.version}${if (type == "source") "_src" else ""}")
CrLfSpec(eol).run {
wa1191SetInputs(gitProps)
with(if (type == "source") sourceLayout() else binaryLayout())
}
}
rootProject.configure<ReleaseExtension> {
archive(archiveTask)
}
}
}
rootProject.configure<ReleaseExtension> {
previewSiteContents {
CrLfSpec().run {
into("site") {
gitattributes(gitProps)
siteLayout()
}
}
}
}
val runGui by tasks.registering() {
group = "Development"
description = "Builds and starts JMeter GUI"
dependsOn(createDist)
doLast {
javaexec {
workingDir = File(project.rootDir, "bin")
main = "org.apache.jmeter.NewDriver"
classpath("$rootDir/bin/ApacheJMeter.jar")
jvmArgs("-Xss256k")
jvmArgs("-XX:MaxMetaspaceSize=256m")
}
}
}

View File

@ -0,0 +1,21 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
dependencies {
api(project(":src:components"))
}

View File

@ -0,0 +1,40 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
dependencies {
api(project(":src:components"))
testCompile(project(":src:components", "testClasses"))
implementation("org.mozilla:rhino")
implementation("commons-codec:commons-codec")
implementation("org.apache.commons:commons-jexl:2.1.1")
implementation("org.apache.commons:commons-jexl3:3.1")
implementation("org.apache.commons:commons-lang3") {
because("StringUtils")
}
implementation("commons-io:commons-io") {
because("FileUtils")
}
implementation("org.apache.commons:commons-text") {
because("StringEscapeUtils")
}
implementation("com.github.ben-manes.caffeine:caffeine")
implementation("oro:oro")
testImplementation("org.hamcrest:hamcrest-core:1.3")
testImplementation("org.exparity:hamcrest-date:2.0.4")
}

View File

@ -0,0 +1,21 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
dependencies {
api(project(":src:components"))
}

View File

@ -0,0 +1,28 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
dependencies {
api(platform(project(":src:bom")))
api("org.slf4j:slf4j-api")
implementation("commons-io:commons-io")
implementation("commons-collections:commons-collections")
implementation("org.apache.commons:commons-lang3")
implementation("org.apache.commons:commons-math3")
}

View File

@ -0,0 +1,35 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
val lastEditYear: String by rootProject.extra
tasks.withType<ProcessResources>().configureEach {
val version = rootProject.version.toString()
inputs.property("@VERSION@", version)
inputs.property("@YEAR@", lastEditYear)
filter { x: String ->
x.replace("@VERSION@", version)
.replace("@YEAR@", lastEditYear)
}
}
tasks.named<Jar>(JavaPlugin.JAR_TASK_NAME) {
manifest {
attributes["Main-Class"] = "org.apache.jmeter.NewDriver"
}
}

View File

@ -0,0 +1,178 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
import com.github.vlsi.gradle.license.GatherLicenseTask
import com.github.vlsi.gradle.license.api.*
import com.github.vlsi.gradle.release.Apache2LicenseRenderer
import com.github.vlsi.gradle.release.ArtifactType
import com.github.vlsi.gradle.release.AsfLicenseCategory
import com.github.vlsi.gradle.release.ExtraLicense
plugins {
id("com.github.vlsi.stage-vote-release")
}
val gatherSourceLicenses by tasks.registering(GatherLicenseTask::class) {
addDependency(":bootstrap:3.3.4", SpdxLicense.MIT)
addDependency(":bootstrap-social:4.8.0", SpdxLicense.MIT)
addDependency(":datatables:1.10.9", SpdxLicense.MIT)
addDependency(":datatables-plugins:1.0.1", SpdxLicense.MIT)
addDependency(":datatables-responsive:1.0.5", SpdxLicense.MIT)
addDependency(":flot:0.8.3", SpdxLicense.MIT)
addDependency(":flot-axislabels:0.8.3", SpdxLicense.MIT)
addDependency(":flot.tooltip:0.8.4", SpdxLicense.MIT)
addDependency(":font-awesome-code:4.2.0", SpdxLicense.MIT)
addDependency(":font-awesome-font:4.2.0", SpdxLicense.OFL_1_1)
addDependency(":jquery:2.1.3", SpdxLicense.MIT)
addDependency(":metisMenu:1.1.3", SpdxLicense.MIT)
addDependency(":start-bootstrap-admin2:1.0.7", SpdxLicense.Apache_2_0)
addDependency(":openiconlibrary:", SpdxLicense.CC_BY_SA_3_0)
}
val gatherBinaryLicenses by tasks.registering(GatherLicenseTask::class) {
configuration(project(":src:dist").configurations.runtimeClasspath)
ignoreMissingLicenseFor.add(SpdxLicense.Apache_2_0.asExpression())
defaultTextFor.add(SpdxLicense.MPL_2_0.asExpression())
// There are three major cases here:
// 1. License id needs to be overridden (e.g. "BSD style" -> BSD-3-Clause)
// 2. Jar file misses LICENSE/NOTICE files, thus we need to specify local folder with relevant files (e.g. licenses/rsyntaxtextarea)
// 3. 1 and 2
// Note we don't use Libs.* below for artifact references to avoid accidental updates
// Whenever you update a dependency that has "license overrides", you need to double-check
// if license conditions still apply.
// For instance, if "dnsjava:dnsjava:2.1.8" was written here as `Libs.dec`, then
// license override might be silently updated as `Libs` class is edited.
// For that purpose, most of the below declarations have expectedLicense so the task
// would fail in case actual license does not meet expectations.
// That enables to have "version-independent" MIT license in licenses/slf4j-api, and
// it would be copied provided the detected license for slf4j-api is MIT.
// Library is not present in Maven Central
overrideLicense("com.github.bulenkov.darcula:darcula:e208efb96f70e4be9dc362fbb46f6e181ef501dd", SpdxLicense.Apache_2_0)
overrideLicense("dnsjava:dnsjava:2.1.8") {
expectedLicense = SpdxLicense.BSD_2_Clause
}
overrideLicense("com.fifesoft:rsyntaxtextarea:3.0.2") {
// https://github.com/bobbylight/RSyntaxTextArea/issues/299
expectedLicense = SimpleLicense(
"Modified BSD License",
uri("http://fifesoft.com/rsyntaxtextarea/RSyntaxTextArea.License.txt")
)
effectiveLicense = SpdxLicense.BSD_3_Clause
}
overrideLicense("com.thoughtworks.xstream:xstream:1.4.11") {
expectedLicense = SimpleLicense("BSD style", uri("http://x-stream.github.io/license.html"))
// https://github.com/x-stream/xstream/issues/151
// https://github.com/x-stream/xstream/issues/153
effectiveLicense = SpdxLicense.BSD_3_Clause
}
overrideLicense("org.ow2.asm:asm:7.1") {
// pom.xml lists license as BSD
expectedLicense = SimpleLicense("BSD", uri("http://asm.ow2.org/license.html"))
effectiveLicense = SpdxLicense.BSD_3_Clause
}
for (jodd in listOf("jodd-core", "jodd-lagarto", "jodd-log", "jodd-props")) {
overrideLicense("org.jodd:$jodd:5.0.6") {
expectedLicense = SpdxLicense.BSD_2_Clause // SimpleLicense("The BSD 2-Clause License", uri("http://jodd.org/license.html"))
licenseFiles = "jodd"
}
}
overrideLicense("xpp3:xpp3_min:1.1.4c") {
// pom.xml contains multiple licenses
expectedLicense = SpdxLicense.CC0_1_0 and
SimpleLicense(
"Indiana University Extreme! Lab Software License, vesion 1.1.1",
uri("http://www.extreme.indiana.edu/viewcvs/~checkout~/XPP3/java/LICENSE.txt")
)
effectiveLicense = SpdxLicense.CC0_1_0 and ExtraLicense.Indiana_University_1_1_1
}
overrideLicense("org.brotli:dec:0.1.2") {
expectedLicense = SpdxLicense.MIT
}
overrideLicense("org.slf4j:jcl-over-slf4j:1.7.25") {
expectedLicense = SpdxLicense.MIT
// See https://github.com/qos-ch/slf4j/blob/v_1.7.25/jcl-over-slf4j/LICENSE.txt
effectiveLicense = SpdxLicense.Apache_2_0
}
overrideLicense("org.slf4j:slf4j-api:1.7.25") {
expectedLicense = SpdxLicense.MIT
}
overrideLicense("net.sf.saxon:Saxon-HE:9.9.1-1") {
expectedLicense = SpdxLicense.MPL_2_0
}
overrideLicense("com.sun.mail:all:1.5.0-b01") {
// Multiple licenses, specify explicitly
expectedLicense = SimpleLicense("CDDL", uri("http://www.sun.com/cddl")) and SimpleLicense("GPLv2+CE", uri("https://glassfish.java.net/public/CDDL+GPL_1_1.html"))
effectiveLicense = SpdxLicense.CDDL_1_0 and (SpdxLicense.GPL_2_0_or_later with SpdxLicenseException.Classpath_exception_2_0)
}
overrideLicense("com.sun.activation:javax.activation:1.2.0") {
expectedLicense = SimpleLicense("CDDL/GPLv2+CE", uri("https://github.com/javaee/activation/blob/master/LICENSE.txt"))
effectiveLicense = SpdxLicense.CDDL_1_0
}
overrideLicense("xml-apis:xml-apis:1.4.01") {
// Multiple licenses, select explicit one
expectedLicense = SpdxLicense.Apache_2_0 and SpdxLicense.SAX_PD and SimpleLicense("The W3C License", uri("http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/java-binding.zip"))
effectiveLicense = SpdxLicense.Apache_2_0
}
overrideLicense("org.hamcrest:hamcrest-core:1.3") {
// https://github.com/hamcrest/JavaHamcrest/issues/264
// pom.xml lists "New BSD License", however it is BSD_3
expectedLicense = SimpleLicense("New BSD License", uri("http://www.opensource.org/licenses/bsd-license.php"))
effectiveLicense = SpdxLicense.BSD_3_Clause
}
overrideLicense("org.exparity:hamcrest-date:2.0.4") {
// https://github.com/eXparity/hamcrest-date/issues/26
// pom.xml lists "New BSD License", however it is BSD_3
expectedLicense = SimpleLicense("New BSD License", uri("http://www.opensource.org/licenses/bsd-license.php"))
effectiveLicense = SpdxLicense.BSD_3_Clause
}
overrideLicense("net.sf.jtidy:jtidy:r938") {
expectedLicense = SimpleLicense("Java HTML Tidy License", uri("http://jtidy.svn.sourceforge.net/viewvc/jtidy/trunk/jtidy/LICENSE.txt?revision=95"))
effectiveLicense = SpdxLicense.BSD_3_Clause
}
}
val renderLicenseForSource by tasks.registering(Apache2LicenseRenderer::class) {
group = LifecycleBasePlugin.BUILD_GROUP
description = "Generate LICENSE file for source distribution"
failOnIncompatibleLicense.set(false)
artifactType.set(ArtifactType.SOURCE)
metadata.from(gatherSourceLicenses)
}
val renderLicenseForBinary by tasks.registering(Apache2LicenseRenderer::class) {
group = LifecycleBasePlugin.BUILD_GROUP
description = "Generate LICENSE file for binary distribution"
failOnIncompatibleLicense.set(false)
artifactType.set(ArtifactType.BINARY)
metadata.from(gatherSourceLicenses)
metadata.from(gatherBinaryLicenses)
licenseCategory.put(ExtraLicense.Indiana_University_1_1_1.asExpression(), AsfLicenseCategory.A)
}

View File

@ -0,0 +1,27 @@
ASM: a very small and fast Java bytecode manipulation framework
Copyright (c) 2000-2011 INRIA, France Telecom
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holders nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
THE POSSIBILITY OF SUCH DAMAGE.

View File

@ -0,0 +1,19 @@
Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View File

@ -0,0 +1,24 @@
Copyright (c) 1998-2011, Brian Wellington.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.

View File

@ -0,0 +1,14 @@
https://fortawesome.github.io/Font-Awesome/license/
Font License
Applies to all desktop and webfont files in the following directory: font-awesome/fonts/.
License: SIL OFL 1.1
URL: http://scripts.sil.org/OFL
Code License
Applies to all CSS and LESS files in the following directories: font-awesome/css/, font-awesome/less/, and font-awesome/scss/.
License: MIT License
URL: http://opensource.org/licenses/mit-license.html

View File

@ -0,0 +1,24 @@
Copyright (c) 2012, Stewart Bissett
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the author nor the names of its contributors may
be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@ -0,0 +1,46 @@
CVS Info: $Id: jCharts_license.txt,v 1.1 2002/07/24 22:25:56 nathaniel_auvil Exp $
jCharts License
----------------------------------------------------------------------------------------
* Copyright 2002 (C) Nathaniel G. Auvil. All Rights Reserved.
*
* Redistribution and use of this software and associated documentation
* ("Software"), with or without modification, are permitted provided
* that the following conditions are met:
*
* 1. Redistributions of source code must retain copyright
* statements and notices. Redistributions must also contain a
* copy of this document.
*
* 2. Redistributions in binary form must reproduce the
* above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other
* materials provided with the distribution.
*
* 3. The name "jCharts" or "Nathaniel G. Auvil" must not be used to
* endorse or promote products derived from this Software without
* prior written permission of Nathaniel G. Auvil. For written
* permission, please contact nathaniel_auvil@users.sourceforge.net
*
* 4. Products derived from this Software may not be called "jCharts"
* nor may "jCharts" appear in their names without prior written
* permission of Nathaniel G. Auvil. jCharts is a registered
* trademark of Nathaniel G. Auvil.
*
* 5. Due credit should be given to the jCharts Project
* (http://jcharts.sourceforge.net/).
*
* THIS SOFTWARE IS PROVIDED BY Nathaniel G. Auvil AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
* NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
* jCharts OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@ -0,0 +1,24 @@
Copyright (c) 2003-present, Jodd Team (https://jodd.org)
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.

View File

@ -0,0 +1,24 @@
Copyright (c) 2012, Robert Futrell
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the author nor the names of its contributors may
be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@ -0,0 +1,21 @@
Copyright (c) 2004-2007 QOS.ch
All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@ -0,0 +1,119 @@
Creative Commons Legal Code
CC0 1.0 Universal CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES
NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE
AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION
ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE USE
OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER, AND DISCLAIMS
LIABILITY FOR DAMAGES RESULTING FROM THE USE OF THIS DOCUMENT OR THE INFORMATION
OR WORKS PROVIDED HEREUNDER.
Statement of Purpose
The laws of most jurisdictions throughout the world automatically confer exclusive
Copyright and Related Rights (defined below) upon the creator and subsequent
owner(s) (each and all, an "owner") of an original work of authorship and/or
a database (each, a "Work").
Certain owners wish to permanently relinquish those rights to a Work for the
purpose of contributing to a commons of creative, cultural and scientific
works ("Commons") that the public can reliably and without fear of later claims
of infringement build upon, modify, incorporate in other works, reuse and
redistribute as freely as possible in any form whatsoever and for any purposes,
including without limitation commercial purposes. These owners may contribute
to the Commons to promote the ideal of a free culture and the further production
of creative, cultural and scientific works, or to gain reputation or greater
distribution for their Work in part through the use and efforts of others.
For these and/or other purposes and motivations, and without any expectation
of additional consideration or compensation, the person associating CC0 with
a Work (the "Affirmer"), to the extent that he or she is an owner of Copyright
and Related Rights in the Work, voluntarily elects to apply CC0 to the Work
and publicly distribute the Work under its terms, with knowledge of his or
her Copyright and Related Rights in the Work and the meaning and intended
legal effect of CC0 on those rights.
1. Copyright and Related Rights. A Work made available under CC0 may be protected
by copyright and related or neighboring rights ("Copyright and Related Rights").
Copyright and Related Rights include, but are not limited to, the following:
i. the right to reproduce, adapt, distribute, perform, display, communicate,
and translate a Work;
ii. moral rights retained by the original author(s) and/or performer(s);
iii. publicity and privacy rights pertaining to a person's image or likeness
depicted in a Work;
iv. rights protecting against unfair competition in regards to a Work, subject
to the limitations in paragraph 4(a), below;
v. rights protecting the extraction, dissemination, use and reuse of data
in a Work;
vi. database rights (such as those arising under Directive 96/9/EC of the
European Parliament and of the Council of 11 March 1996 on the legal protection
of databases, and under any national implementation thereof, including any
amended or successor version of such directive); and
vii. other similar, equivalent or corresponding rights throughout the world
based on applicable law or treaty, and any national implementations thereof.
2. Waiver. To the greatest extent permitted by, but not in contravention of,
applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and
unconditionally waives, abandons, and surrenders all of Affirmer's Copyright
and Related Rights and associated claims and causes of action, whether now
known or unknown (including existing as well as future claims and causes of
action), in the Work (i) in all territories worldwide, (ii) for the maximum
duration provided by applicable law or treaty (including future time extensions),
(iii) in any current or future medium and for any number of copies, and (iv)
for any purpose whatsoever, including without limitation commercial, advertising
or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the
benefit of each member of the public at large and to the detriment of Affirmer's
heirs and successors, fully intending that such Waiver shall not be subject
to revocation, rescission, cancellation, termination, or any other legal or
equitable action to disrupt the quiet enjoyment of the Work by the public
as contemplated by Affirmer's express Statement of Purpose.
3. Public License Fallback. Should any part of the Waiver for any reason be
judged legally invalid or ineffective under applicable law, then the Waiver
shall be preserved to the maximum extent permitted taking into account Affirmer's
express Statement of Purpose. In addition, to the extent the Waiver is so
judged Affirmer hereby grants to each affected person a royalty-free, non
transferable, non sublicensable, non exclusive, irrevocable and unconditional
license to exercise Affirmer's Copyright and Related Rights in the Work (i)
in all territories worldwide, (ii) for the maximum duration provided by applicable
law or treaty (including future time extensions), (iii) in any current or
future medium and for any number of copies, and (iv) for any purpose whatsoever,
including without limitation commercial, advertising or promotional purposes
(the "License"). The License shall be deemed effective as of the date CC0
was applied by Affirmer to the Work. Should any part of the License for any
reason be judged legally invalid or ineffective under applicable law, such
partial invalidity or ineffectiveness shall not invalidate the remainder of
the License, and in such case Affirmer hereby affirms that he or she will
not (i) exercise any of his or her remaining Copyright and Related Rights
in the Work or (ii) assert any associated claims and causes of action with
respect to the Work, in either case contrary to Affirmer's express Statement
of Purpose.
4. Limitations and Disclaimers.
a. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered,
licensed or otherwise affected by this document.
b. Affirmer offers the Work as-is and makes no representations or warranties
of any kind concerning the Work, express, implied, statutory or otherwise,
including without limitation warranties of title, merchantability, fitness
for a particular purpose, non infringement, or the absence of latent or other
defects, accuracy, or the present or absence of errors, whether or not discoverable,
all to the greatest extent permissible under applicable law.
c. Affirmer disclaims responsibility for clearing rights of other persons
that may apply to the Work or any use thereof, including without limitation
any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims
responsibility for obtaining any necessary consents, permissions or other
rights required for any use of the Work.
d. Affirmer understands and acknowledges that Creative Commons is not a party
to this document and has no duty or obligation with respect to this CC0 or
use of the Work.

View File

@ -0,0 +1,119 @@
Creative Commons Legal Code
CC0 1.0 Universal CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES
NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE
AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION
ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE USE
OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER, AND DISCLAIMS
LIABILITY FOR DAMAGES RESULTING FROM THE USE OF THIS DOCUMENT OR THE INFORMATION
OR WORKS PROVIDED HEREUNDER.
Statement of Purpose
The laws of most jurisdictions throughout the world automatically confer exclusive
Copyright and Related Rights (defined below) upon the creator and subsequent
owner(s) (each and all, an "owner") of an original work of authorship and/or
a database (each, a "Work").
Certain owners wish to permanently relinquish those rights to a Work for the
purpose of contributing to a commons of creative, cultural and scientific
works ("Commons") that the public can reliably and without fear of later claims
of infringement build upon, modify, incorporate in other works, reuse and
redistribute as freely as possible in any form whatsoever and for any purposes,
including without limitation commercial purposes. These owners may contribute
to the Commons to promote the ideal of a free culture and the further production
of creative, cultural and scientific works, or to gain reputation or greater
distribution for their Work in part through the use and efforts of others.
For these and/or other purposes and motivations, and without any expectation
of additional consideration or compensation, the person associating CC0 with
a Work (the "Affirmer"), to the extent that he or she is an owner of Copyright
and Related Rights in the Work, voluntarily elects to apply CC0 to the Work
and publicly distribute the Work under its terms, with knowledge of his or
her Copyright and Related Rights in the Work and the meaning and intended
legal effect of CC0 on those rights.
1. Copyright and Related Rights. A Work made available under CC0 may be protected
by copyright and related or neighboring rights ("Copyright and Related Rights").
Copyright and Related Rights include, but are not limited to, the following:
i. the right to reproduce, adapt, distribute, perform, display, communicate,
and translate a Work;
ii. moral rights retained by the original author(s) and/or performer(s);
iii. publicity and privacy rights pertaining to a person's image or likeness
depicted in a Work;
iv. rights protecting against unfair competition in regards to a Work, subject
to the limitations in paragraph 4(a), below;
v. rights protecting the extraction, dissemination, use and reuse of data
in a Work;
vi. database rights (such as those arising under Directive 96/9/EC of the
European Parliament and of the Council of 11 March 1996 on the legal protection
of databases, and under any national implementation thereof, including any
amended or successor version of such directive); and
vii. other similar, equivalent or corresponding rights throughout the world
based on applicable law or treaty, and any national implementations thereof.
2. Waiver. To the greatest extent permitted by, but not in contravention of,
applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and
unconditionally waives, abandons, and surrenders all of Affirmer's Copyright
and Related Rights and associated claims and causes of action, whether now
known or unknown (including existing as well as future claims and causes of
action), in the Work (i) in all territories worldwide, (ii) for the maximum
duration provided by applicable law or treaty (including future time extensions),
(iii) in any current or future medium and for any number of copies, and (iv)
for any purpose whatsoever, including without limitation commercial, advertising
or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the
benefit of each member of the public at large and to the detriment of Affirmer's
heirs and successors, fully intending that such Waiver shall not be subject
to revocation, rescission, cancellation, termination, or any other legal or
equitable action to disrupt the quiet enjoyment of the Work by the public
as contemplated by Affirmer's express Statement of Purpose.
3. Public License Fallback. Should any part of the Waiver for any reason be
judged legally invalid or ineffective under applicable law, then the Waiver
shall be preserved to the maximum extent permitted taking into account Affirmer's
express Statement of Purpose. In addition, to the extent the Waiver is so
judged Affirmer hereby grants to each affected person a royalty-free, non
transferable, non sublicensable, non exclusive, irrevocable and unconditional
license to exercise Affirmer's Copyright and Related Rights in the Work (i)
in all territories worldwide, (ii) for the maximum duration provided by applicable
law or treaty (including future time extensions), (iii) in any current or
future medium and for any number of copies, and (iv) for any purpose whatsoever,
including without limitation commercial, advertising or promotional purposes
(the "License"). The License shall be deemed effective as of the date CC0
was applied by Affirmer to the Work. Should any part of the License for any
reason be judged legally invalid or ineffective under applicable law, such
partial invalidity or ineffectiveness shall not invalidate the remainder of
the License, and in such case Affirmer hereby affirms that he or she will
not (i) exercise any of his or her remaining Copyright and Related Rights
in the Work or (ii) assert any associated claims and causes of action with
respect to the Work, in either case contrary to Affirmer's express Statement
of Purpose.
4. Limitations and Disclaimers.
a. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered,
licensed or otherwise affected by this document.
b. Affirmer offers the Work as-is and makes no representations or warranties
of any kind concerning the Work, express, implied, statutory or otherwise,
including without limitation warranties of title, merchantability, fitness
for a particular purpose, non infringement, or the absence of latent or other
defects, accuracy, or the present or absence of errors, whether or not discoverable,
all to the greatest extent permissible under applicable law.
c. Affirmer disclaims responsibility for clearing rights of other persons
that may apply to the Work or any use thereof, including without limitation
any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims
responsibility for obtaining any necessary consents, permissions or other
rights required for any use of the Work.
d. Affirmer understands and acknowledges that Creative Commons is not a party
to this document and has no duty or obligation with respect to this CC0 or
use of the Work.

View File

@ -0,0 +1,46 @@
Indiana University Extreme! Lab Software License
Version 1.1.1
Copyright (c) 2002 Extreme! Lab, Indiana University. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the distribution.
3. The end-user documentation included with the redistribution, if any,
must include the following acknowledgment:
"This product includes software developed by the Indiana University
Extreme! Lab (http://www.extreme.indiana.edu/)."
Alternately, this acknowledgment may appear in the software itself,
if and wherever such third-party acknowledgments normally appear.
4. The names "Indiana Univeristy" and "Indiana Univeristy Extreme! Lab"
must not be used to endorse or promote products derived from this
software without prior written permission. For written permission,
please contact http://www.extreme.indiana.edu/.
5. Products derived from this software may not use "Indiana Univeristy"
name nor may "Indiana Univeristy" appear in their name, without prior
written permission of the Indiana University.
THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE AUTHORS, COPYRIGHT HOLDERS OR ITS CONTRIBUTORS
BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@ -0,0 +1,28 @@
(BSD Style License)
Copyright (c) 2003-2006, Joe Walnes
Copyright (c) 2006-2019, XStream Committers
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
Redistributions of source code must retain the above copyright notice, this list of
conditions and the following disclaimer. Redistributions in binary form must reproduce
the above copyright notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the distribution.
Neither the name of XStream nor the names of its contributors may be used to endorse
or promote products derived from this software without specific prior written
permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.

View File

@ -0,0 +1,195 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
subprojects {
dependencies {
api(project(":src:core"))
testCompile(project(":src:core", "testClasses"))
}
}
project("ftp") {
dependencies {
implementation("commons-net:commons-net:3.6")
implementation("commons-io:commons-io") {
because("IOUtils")
}
implementation("org.apache.commons:commons-lang3") {
because("StringUtils")
}
}
}
project("http") {
dependencies {
// for SearchTextExtension
api(project(":src:components"))
testCompile(project(":src:components", "testClasses"))
api("com.thoughtworks.xstream:xstream") {
because("HTTPResultConverter uses XStream in public API")
}
compileOnly("javax.activation:javax.activation-api") {
because("ParseCurlCommandAction uses new MimetypesFileTypeMap()")
}
implementation("com.github.ben-manes.caffeine:caffeine")
implementation("commons-io:commons-io") {
because("IOUtils")
}
implementation("org.apache.commons:commons-lang3") {
because("StringUtils")
}
implementation("org.apache.commons:commons-text") {
because("StringEscapeUtils")
}
implementation("org.jodd:jodd-lagarto")
implementation("org.jsoup:jsoup")
implementation("oro:oro")
implementation("commons-collections:commons-collections")
implementation("commons-net:commons-net:3.6")
implementation("com.helger:ph-commons:9.2.1") {
// We don't really need to use/distribute jsr305
exclude("com.google.code.findbugs", "jsr305")
}
implementation("com.helger:ph-css:6.1.1") {
// We don't really need to use/distribute jsr305
exclude("com.google.code.findbugs", "jsr305")
}
implementation("dnsjava:dnsjava:2.1.8")
implementation("org.apache.httpcomponents:httpmime:4.5.8")
implementation("org.brotli:dec:0.1.2")
}
}
project("java") {
dependencies {
implementation("org.apache.commons:commons-dbcp2:2.5.0")
implementation("org.apache.commons:commons-lang3") {
because("ArrayUtils")
}
implementation("commons-io:commons-io") {
because("IOUtils")
}
}
}
project("jdbc") {
dependencies {
implementation("org.apache.commons:commons-dbcp2:2.5.0")
implementation("org.apache.commons:commons-lang3") {
because("StringUtils, ObjectUtils")
}
implementation("commons-io:commons-io") {
because("IOUtils")
}
}
}
project("jms") {
dependencies {
testCompile(project(":src:core", "testClasses"))
api("com.github.ben-manes.caffeine:caffeine") {
because("MessageRenderer#getValueFromFile(..., caffeine.cache.Cache)")
}
// TODO: technically speaking, jms_1.1_spec should be compileOnly
// since we either include a JMS implementation or we can't use JMS at all
implementation("org.apache.geronimo.specs:geronimo-jms_1.1_spec:1.1.1")
implementation("org.apache.commons:commons-lang3") {
because("StringUtils")
}
implementation("commons-io:commons-io") {
because("IOUtils")
}
}
}
project("junit") {
dependencies {
api("junit:junit:4.12")
implementation("org.apache.commons:commons-lang3") {
because("ArrayUtils")
}
implementation("org.exparity:hamcrest-date") {
because("hamcrest-date.jar was historically shipped with JMeter")
}
}
}
project("junit-sample") {
dependencies {
api("junit:junit:4.12")
}
}
project("ldap") {
dependencies {
implementation("org.apache.commons:commons-text") {
because("StringEscapeUtils")
}
}
}
project("mail") {
dependencies {
api("javax.mail:mail:1.5.0-b01") {
exclude("javax.activation", "activation")
}
// There's no javax.activation:activation:1.2.0, so we use com.sun...
runtimeOnly("com.sun.activation:javax.activation")
// This is an API-only jar. javax.activation is present in Java 8,
// however it is not there in Java 9
compileOnly("javax.activation:javax.activation-api")
implementation("org.apache.commons:commons-lang3") {
because("StringUtils")
}
implementation("commons-io:commons-io") {
because("IOUtils")
}
}
}
project("mongodb") {
dependencies {
api("org.mongodb:mongo-java-driver:2.11.3")
implementation("org.apache.commons:commons-lang3") {
because("StringUtils")
}
}
}
project("native") {
dependencies {
implementation("org.apache.commons:commons-lang3") {
because("StringUtils")
}
}
}
project("tcp") {
dependencies {
implementation("org.apache.commons:commons-lang3") {
because("ArrayUtils")
}
implementation("commons-io:commons-io") {
because("IOUtils")
}
}
}

View File

@ -13,6 +13,7 @@
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.jmeter.protocol.http.sampler;

View File

@ -0,0 +1,97 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
import com.github.vlsi.gradle.release.ReleaseExtension
import com.github.vlsi.gradle.release.ReleaseParams
rootProject.configure<ReleaseExtension> {
voteText.set { it.voteTextGen() }
}
fun ReleaseParams.voteTextGen(): String = """
The first release candidate for JMeter $version ($shortGitSha) has been
prepared, and your votes are solicited.
This release is mainly a bugfix
Please, test this release candidate (with load tests and/or functional
tests) using Java 8+ on Linux/Windows/macOS, especially on the changes.
Feedback is very welcome within the next 72 hours.
You can read the New and Noteworthy section with some screenshots to
illustrate improvements and full list of changes at:
$previewSiteUri/site/changes.html
JMeter is a Java desktop application designed to load test functional
behavior and measure performance. The current version targets Java 8+
Download - Archives/hashes/sigs:
$svnStagingUri
(dist revision TBD:SVN revision of svnmucc stage result)
RAT report:
$previewSiteUri/rat/rat-report.txt
SHA512 hashes of archives for this vote: see footnote [1]
Site preview is here:
$previewSiteUri/site/
JavaDoc API preview is here:
$previewSiteUri/site/api
Maven staging repository is accessible here:
$nexusRepositoryUri/org/apache/$tlpUrl/
Tag:
$sourceCodeTagUrl
Keys are here:
https://www.apache.org/dist/$tlpUrl/KEYS
N.B.
To create the jars and test $tlp: "./gradlew build".
$tlp $version requires Java 8 or later to run.
Some known issues and incompatible changes are listed on changes page.
$previewSiteUri/site/changes.html#Known%20problems%20and%20workarounds
All feedback and vote are welcome.
[ ] +1 I support this release
[ ] +0 I am OK with this release
[ ] -0 OK, but....
[ ] -1 I do not support this release (please indicate why)
The vote will remain open for at least 72 hours.
The PMC members please indicate the mention "(binding)" with your vote.
Note: If the vote passes, the intention is to release the archive files
and rename the RC tag as the release tag.
Thanks in advance!
===
[1] SHA512 hashes of archives for this vote:
${artifacts.joinToString(System.lineSeparator()) { it.sha512 + System.lineSeparator() + "*" + it.name }}
""".trimIndent()

View File

@ -1,4 +1,4 @@
<?xml version="1.0"?>
<?xml version="1.0" encoding="utf-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
@ -29,20 +29,50 @@
Before you can compile JMeter, you will need a few things:
<ul>
<li>a Java 8 compatible JDK (Java Development Kit)</li>
<li>a working installation of <a href="http://ant.apache.org">Ant</a> (at least version 1.9.1)</li>
<li>Optional: <a href="https://gradle.org/">Gradle</a> installation</li>
<li>the JMeter sources as shown in the next section</li>
</ul>
<h3>Acquiring the source</h3>
<p>The full source is distributed alongside the binary, and you can also find it <a href="./svnindex.html">in the source repositories.</a></p>
<p>The official source releases of Apache JMeter can be downloaded from <a href="download_jmeter.cgi">download page</a>.</p>
<h3>Compiling and packaging JMeter using Gradle</h3>
<p>
The source archive, SVN and GIT do not contain any of the required library files.
JMeter can be built entirely using Gradle.
The basic command is:</p>
<source>
./gradlew build
</source>
<p>
See the list of available tasks via <code>./gradlew tasks</code> (or <code>./gradlew tasks --all</code>)
for the other tasks that can be used.
</p>
<h3>Opening project via IntelliJ IDEA</h3>
<p>You require IntelliJ 2018.3.1 or newer.</p>
<ul>
<li>Open the build.gradle.kts file with IntelliJ IDEA and choose "Open as Project"</li>
<li>Make sure "Create separate module per source set" is selected</li>
<li>Make sure "Use default gradle wrapper" is selected</li>
<li>In the "File already exists" dialogue, choose "Yes" to overwrite</li>
<li>In the "Open Project" dialogue, choose "Delete Existing Project and Import"</li>
</ul>
<h3>Compiling and packaging JMeter using Eclipse</h3>
<h4>Option 1 : Setting up Eclipse project with Ant task</h4>
Once you have downloaded the sources using git or svn, you can setup the Eclipse project by running:
<h4>Option 1 : Importing Eclipse project via Eclipse's "import Gradle project" wizard</h4>
Recent Eclipse versions can import Gradle projects automatically, so use
<menuchoice>
<guimenuitem>File</guimenuitem>
<guimenuitem>Import...</guimenuitem>
</menuchoice>
Then choose <menuchoice><guimenuitem>Existing Gradle Project</guimenuitem></menuchoice> and proceed
with the import.
<source>ant setup-eclipse-project</source>
<h4>Option 2 : Setting up Eclipse project with Gradle task</h4>
Once you have downloaded the sources, you can setup the Eclipse project by running:
<source>./gradlew eclipse</source>
You can then import the project using
<menuchoice>
@ -51,65 +81,7 @@ You can then import the project using
<guimenuitem>Existing projects into Workspace</guimenuitem>
</menuchoice> and select the folder containing JMeter sources.
<h4>Option 2 : Setting up Eclipse project manually</h4>
The first step is to download dependencies by running the Ant command:</p>
<source>
ant download_jars
</source>
<p>Or you can download the binary distribution archive for a release and unpack it into the same directory structure as the source.
This will ensure that the <code>lib/</code> directory contains the jar files needed for running JMeter.
There are a few additional jars that are needed to build JMeter, download these using:
</p>
<source>
ant download_jars
</source>
<p>
This will retrieve any missing jars.
</p>
<note>
If you are behind a proxy, you can set a few build properties in <code>build-local.properties</code> for ant to use the proxy:
<source>
proxy.use=true
proxy.host=proxy.example.invalid
proxy.port=8080
proxy.user=your_user_name
proxy.pass=your_password
</source>
You might also want to skip some tests - that are failing without proper access to the internet - by adding some more
properties into <code>build-local.properties</code>:
<source>
skip.bug52310=true
skip.bug60607=true
skip.batchtest_Http4ImplPreemptiveBasicAuth=true
skip.batchtest_SlowCharsFeature=true
skip.batchtest_TestKeepAlive=true
skip.test_http=true
skip.test_TestDNSCacheManager.testWithCustomResolverAnd1Server=true
</source>
</note>
<p>
Once you have downloaded the source from SVN or the release archives and run the ant <code>download_jars</code> target to
install the dependent jars, you can configure Eclipse. The easiest way to do this is to replace the Eclipse <code>.classpath</code>
file with the <code>eclipse.classpath</code> file provided with JMeter. This will set up the source-paths and most of the libraries.
</p>
<p>
Ensure you read <code>eclipse.md</code> for project configuration.
</p>
<h3>Compiling and packaging JMeter using Ant</h3>
<p>
JMeter can be built entirely using Ant.
The basic command is:</p>
<source>
ant install
</source>
<p>
See <code>build.xml</code> (or call <code>ant -p</code>) for the other targets that can be used. Note that you can skip the word <code><em>install</em></code> after <code>ant</code> as it is the default target.
</p>
</section>
<section name="Contributing to JMeter">
<h2>We love contribution</h2>
<p>
@ -129,11 +101,11 @@ Before submitting your patch ensure you do the following:<br/>
Check that patch compiles and follows Tab space policy by running:
</p>
<source>ant package-and-check</source>
<source>./gradlew check</source>
<p>
Check that patch does not break JUnit tests by running:
</p>
<source>ant test</source>
<source>./gradlew test</source>
<h3>Create a PR using GIT</h3>
<ul>
@ -143,17 +115,20 @@ Check that patch does not break JUnit tests by running:
<li>Create a branch using for example bugzilla id: <source>git branch BUGID</source></li>
<li>Checkout the new branch : <source>git checkout BUGID</source></li>
<li>commit your fix there : <source>git commit -m 'Fix to BUGID' list of files</source></li>
<li>Please avoid creating merge commits in the PR. We embrace small changes, and merge commits are harder to review</li>
<li>Add JMeter repository as upstream : <source>git remote add upstream http://www.github.com/apache/jmeter</source></li>
<li>push it : <source>git push origin BUGID</source></li>
<li>Create a PR and link it in the bugzilla issue</li>
</ul>
<note>We have added a <code>.gitattributes</code> file to configure line endings of the files under version control.
Those settings can lead to strange looking <em>changes</em> on some newly checked out files, e.g. JavaScript or CSS files,
where the only change is the line ending.<br/>
To get rid of those problems set <code>core.autocrlf</code> to <code>input</code> before you clone the repository using
the following command:
<source>git config --global core.autocrlf input</source>
<note>Different operation systems have different defaults for end-of-line markers.
Typical configuration is CRLF for Windows and LF for macOS and GNU/Linux.<br/>
It is recommended to follow that configuration by appropriate settings of <code>core.autocrlf</code>.
For Windows <source>git config --global core.autocrlf true</source>, and for macOS and GNU/Linux set <source>git config --global core.autocrlf input</source>
Git will automatically recognize text files in the repository thanks to <code>.gitattributes</code>,
and Git will convert line endings for text files to the appropriate platform-native format (according to <code>core.autocrlf</code>)<br/>
Certain files (e.g. <code>*.sh</code> or <code>*.bat</code>) have predefined end of line policy
no matter the configuration of the developer workstation.
</note>
<h3>Create a PR using Patch</h3>

View File

@ -1,98 +0,0 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<document>
<properties>
<author email="dev.AT.jmeter.DOT.apache.DOT.org">Apache JMeter Project</author>
<title>Source Repositories</title>
</properties>
<body>
<section name="Download the Source">
<p>Most users of the source code probably don't need to have day to
day access to the source code as it changes. For these users we
provide easy to unpack source code downloads via our <a
href="download_jmeter.cgi">download page</a>. </p>
</section>
<section name="Access the SVN Version Controlled Source Code">
<p>For information on connecting to the ASF Subversion repositories, see the <a
href="http://www.apache.org/dev/version-control.html">version control
page</a>. </p>
<p>Modules available for access are listed below.</p>
<subsection name="Subversion" anchor="subversion">
<p><a href="http://subversion.apache.org">Subversion</a> is an open-source version control system. The root url of the
ASF Subversion repository is <a href="http://svn.apache.org/repos/asf/">http://svn.apache.org/repos/asf/</a> for non-committers and <a href="https://svn.apache.org/repos/asf/">https://svn.apache.org/repos/asf/</a> for committers. </p>
<p><b>NOTE</b>:
When checking out a subproject using Subversion, ensure that you are checking out a tag, a branch or trunk (the main-line) and not all tags and branches to avoid filling up your hard-disk and wasting bandwidth. </p>
<table>
<tr>
<th>Project</th>
<th>http (read-only)</th>
<th>https (committers)</th>
<th>View-SVN</th>
</tr>
<tr>
<td>Apache JMeter</td>
<td><a href="http://svn.apache.org/repos/asf/jmeter/trunk">http://svn.apache.org/repos/asf/jmeter/trunk</a></td>
<td><a href="https://svn.apache.org/repos/asf/jmeter/trunk">https://svn.apache.org/repos/asf/jmeter/trunk</a></td>
<td><a href="http://svn.apache.org/viewcvs.cgi/jmeter/">http://svn.apache.org/viewcvs.cgi/jmeter/</a></td>
</tr>
</table>
</subsection>
</section>
<section name="Access the GIT Version Controlled Source Code">
<p>For information on connecting to the GIT mirror repositories, see the <a
href="http://www.apache.org/dev/git.html">version control
page</a>. </p>
<subsection name="Git" anchor="git">
<p>Apache maintains read-only GIT mirrors of Apache codebases, for JMeter, the mirror is accessible at the urls below.</p>
<table>
<tr>
<th>Project</th>
<th>GIT (read-only)</th>
<th>GITHUB (read-only)</th>
</tr>
<tr>
<td>Apache JMeter</td>
<td><a href="git://git.apache.org/jmeter.git">git://git.apache.org/jmeter.git</a></td>
<td><a href="https://github.com/apache/jmeter">https://github.com/apache/jmeter</a></td>
</tr>
</table>
</subsection>
</section>
</body>
</document>

View File

@ -13,7 +13,6 @@
# See the License for the specific language governing permissions and
# limitations under the License.
resource.loader.1.resource.path = xdocs/stylesheets
# set true to debug vsl files
runtime.references.strict=true
input.encoding=utf-8