Skip to content

Commit eedabdd

Browse files
authored
feat: use ServiceLoader to find implementations instead of searching classes in jars (#5885)
ServiceLoader is Java standard approach for locating implementaitons, and it allows pluggability without relying on a filesystem layout. Fixes #5883
1 parent 5542be1 commit eedabdd

File tree

186 files changed

+1558
-297
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

186 files changed

+1558
-297
lines changed

build-logic/jvm/build.gradle.kts

+2-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ dependencies {
2424
api(projects.verification)
2525
api("com.github.vlsi.crlf:com.github.vlsi.crlf.gradle.plugin:1.88")
2626
api("com.github.vlsi.gradle-extensions:com.github.vlsi.gradle-extensions.gradle.plugin:1.88")
27-
api("org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.21")
27+
api("org.jetbrains.kotlin.jvm:org.jetbrains.kotlin.jvm.gradle.plugin:1.8.21")
28+
api("org.jetbrains.kotlin.kapt:org.jetbrains.kotlin.kapt.gradle.plugin:1.8.21")
2829
api("org.jetbrains.dokka:org.jetbrains.dokka.gradle.plugin:1.8.10")
2930
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to you under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
18+
import com.github.vlsi.gradle.dsl.configureEach
19+
20+
plugins {
21+
id("java-library")
22+
}
23+
24+
dependencies {
25+
annotationProcessor("com.google.auto.service:auto-service")
26+
compileOnlyApi("com.google.auto.service:auto-service-annotations")
27+
}
28+
29+
tasks.configureEach<JavaCompile> {
30+
// Verify @AutoService annotations
31+
options.compilerArgs.add("-Averify=true")
32+
}
33+
34+
plugins.withId("org.jetbrains.kotlin.jvm") {
35+
apply(plugin = "org.jetbrains.kotlin.kapt")
36+
37+
dependencies {
38+
"kapt"("com.google.auto.service:auto-service")
39+
// Unfortunately, plugins.withId("..kapt") can't be used as kapt plugin adds configuration via plugins.withId
40+
findProject(":src:bom-thirdparty")?.let {
41+
"kapt"(platform(it))
42+
}
43+
}
44+
}
45+
46+
tasks.configureEach<Jar> {
47+
manifest {
48+
attributes["JMeter-Skip-Class-Scanning"] = "true"
49+
}
50+
}

build-logic/jvm/src/main/kotlin/build-logic.java-library.gradle.kts

+1
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,5 @@
1818
plugins {
1919
id("build-logic.java")
2020
id("java-library")
21+
id("build-logic.autoservice")
2122
}

build-logic/jvm/src/main/kotlin/build-logic.java.gradle.kts

+1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ dependencies {
5959
}
6060
findProject(":src:bom-thirdparty")?.let{
6161
api(platform(it))
62+
annotationProcessor(platform(it))
6263
}
6364
}
6465

build-logic/jvm/src/main/kotlin/build-logic.jvm-library.gradle.kts

+1-2
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@
1616
*/
1717

1818
plugins {
19-
id("build-logic.java")
20-
id("java-library")
19+
id("build-logic.java-library")
2120
}
2221

2322
if (file("src/main/groovy").isDirectory || file("src/test/groovy").isDirectory) {

build-logic/jvm/src/main/kotlin/build-logic.kotlin.gradle.kts

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ plugins {
2525
id("build-logic.test-base")
2626
id("com.github.autostyle")
2727
kotlin("jvm")
28+
kotlin("kapt") apply false
2829
}
2930

3031
dependencies {

build-logic/root-build/build.gradle.kts

+1
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,5 @@ dependencies {
2727
api("com.github.vlsi.gradle-extensions:com.github.vlsi.gradle-extensions.gradle.plugin:1.88")
2828
api("org.nosphere.apache.rat:org.nosphere.apache.rat.gradle.plugin:0.8.0")
2929
api("org.jetbrains.gradle.plugin.idea-ext:org.jetbrains.gradle.plugin.idea-ext.gradle.plugin:1.1.7")
30+
api("org.jetbrains.kotlin.jvm:org.jetbrains.kotlin.jvm.gradle.plugin:1.8.21")
3031
}

build-logic/root-build/src/main/kotlin/build-logic.root-build.gradle.kts

+1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ plugins {
2626
id("com.github.vlsi.ide")
2727
id("org.nosphere.apache.rat")
2828
id("org.jetbrains.gradle.plugin.idea-ext")
29+
kotlin("jvm") apply false
2930
}
3031

3132
ide {

build.gradle.kts

+2-1
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ val notPublishedProjects by extra {
6161
projects.src.release,
6262
projects.src.testkit,
6363
projects.src.testkitWiremock,
64+
projects.src.testServices,
6465
).mapTo(mutableSetOf()) { it.dependencyProject }
6566
}
6667

@@ -86,7 +87,7 @@ publishedProjects.forEach {project ->
8687
throw IllegalStateException(
8788
"Project ${project.path} is listed in publishedProjects, however it misses maven-publish plugin. " +
8889
"Please add maven-publish plugin (e.g. replace build-logic.jvm-library with build-logic.jvm-published-library) or " +
89-
"move the project to the list of published ones"
90+
"move the project to the list of notPublishedProjects"
9091
)
9192
}
9293
}

gradle.properties

+2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ org.gradle.parallel=true
2121
org.gradle.caching=true
2222
#org.gradle.caching.debug=true
2323

24+
kapt.include.compile.classpath=false
25+
2426
# See https://github.com/gradle/gradle/pull/11358 , https://issues.apache.org/jira/browse/INFRA-14923
2527
# repository.apache.org does not yet support .sha256 and .sha512 checksums
2628
systemProp.org.gradle.internal.publish.checksums.insecure=true

settings.gradle.kts

+1
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ include(
7676
"src:release",
7777
"src:testkit",
7878
"src:testkit-wiremock",
79+
"src:test-services",
7980
"src:dist",
8081
"src:dist-check"
8182
)

src/bom-thirdparty/build.gradle.kts

+2
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ dependencies {
4242

4343
api("bsf:bsf:2.4.0")
4444
api("cglib:cglib-nodep:3.3.0")
45+
api("com.google.auto.service:auto-service:1.0.1")
46+
api("com.google.auto.service:auto-service-annotations:1.0.1")
4547
api("com.fasterxml.jackson.core:jackson-annotations:2.13.4")
4648
api("com.fasterxml.jackson.core:jackson-core:2.13.4")
4749
api("com.fasterxml.jackson.core:jackson-databind:2.13.4.2")

src/components/src/main/java/org/apache/jmeter/extractor/json/render/RenderAsJmesPathRenderer.java

+3
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,21 @@
1919

2020
import org.apache.jmeter.extractor.json.jmespath.JMESPathCache;
2121
import org.apache.jmeter.util.JMeterUtils;
22+
import org.apache.jmeter.visualizers.ResultRenderer;
2223
import org.slf4j.Logger;
2324
import org.slf4j.LoggerFactory;
2425

2526
import com.fasterxml.jackson.core.JsonProcessingException;
2627
import com.fasterxml.jackson.databind.JsonNode;
2728
import com.fasterxml.jackson.databind.ObjectMapper;
2829
import com.fasterxml.jackson.databind.node.ArrayNode;
30+
import com.google.auto.service.AutoService;
2931

3032
/**
3133
* Implement ResultsRender for JMES Path tester
3234
* @since 5.2
3335
*/
36+
@AutoService(ResultRenderer.class)
3437
public class RenderAsJmesPathRenderer extends AbstractRenderAsJsonRenderer {
3538
private static final Logger log = LoggerFactory.getLogger(RenderAsJmesPathRenderer.class);
3639
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

src/components/src/main/java/org/apache/jmeter/extractor/json/render/RenderAsJsonRenderer.java

+4
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,17 @@
2121

2222
import org.apache.jmeter.extractor.json.jsonpath.JSONManager;
2323
import org.apache.jmeter.util.JMeterUtils;
24+
import org.apache.jmeter.visualizers.ResultRenderer;
2425
import org.slf4j.Logger;
2526
import org.slf4j.LoggerFactory;
2627

28+
import com.google.auto.service.AutoService;
29+
2730
/**
2831
* Implement ResultsRender for JSON Path tester
2932
* @since 3.0
3033
*/
34+
@AutoService(ResultRenderer.class)
3135
public class RenderAsJsonRenderer extends AbstractRenderAsJsonRenderer {
3236
private static final Logger log = LoggerFactory.getLogger(RenderAsJsonRenderer.class);
3337

src/components/src/main/java/org/apache/jmeter/gui/action/ExportTransactionAndSamplerNames.java

+6
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,16 @@
5353
import org.slf4j.Logger;
5454
import org.slf4j.LoggerFactory;
5555

56+
import com.google.auto.service.AutoService;
57+
5658
/**
5759
* Export transactions names for web report
5860
* @since 3.3
5961
*/
62+
@AutoService({
63+
Command.class,
64+
MenuCreator.class
65+
})
6066
public class ExportTransactionAndSamplerNames extends AbstractAction implements MenuCreator {
6167
private static final Logger log = LoggerFactory.getLogger(ExportTransactionAndSamplerNames.class);
6268

src/components/src/main/java/org/apache/jmeter/visualizers/RenderAsBoundaryExtractor.java

+3
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,12 @@
4141
import org.apache.jorphan.gui.GuiUtils;
4242
import org.apache.jorphan.gui.JLabeledTextField;
4343

44+
import com.google.auto.service.AutoService;
45+
4446
/**
4547
* Implement ResultsRender for Boundary Extractor tester
4648
*/
49+
@AutoService(ResultRenderer.class)
4750
public class RenderAsBoundaryExtractor implements ResultRenderer, ActionListener {
4851

4952
private static final String BOUNDARY_EXTRACTOR_TESTER_COMMAND = "boundary_extractor_tester"; // $NON-NLS-1$

src/components/src/main/java/org/apache/jmeter/visualizers/RenderAsCssJQuery.java

+3
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,13 @@
4949
import org.apache.jorphan.gui.JLabeledTextField;
5050
import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
5151

52+
import com.google.auto.service.AutoService;
53+
5254
/**
5355
* Implement ResultsRender for CSS/JQuery tester
5456
* @since 2.10
5557
*/
58+
@AutoService(ResultRenderer.class)
5659
public class RenderAsCssJQuery implements ResultRenderer, ActionListener {
5760

5861
private static final String CSSJQUEY_TESTER_COMMAND = "cssjquery_tester"; // $NON-NLS-1$

src/components/src/main/java/org/apache/jmeter/visualizers/RenderAsDocument.java

+3
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@
2323
import org.slf4j.Logger;
2424
import org.slf4j.LoggerFactory;
2525

26+
import com.google.auto.service.AutoService;
27+
28+
@AutoService(ResultRenderer.class)
2629
public class RenderAsDocument extends SamplerResultTab implements ResultRenderer {
2730

2831
private static final Logger log = LoggerFactory.getLogger(RenderAsDocument.class);

src/components/src/main/java/org/apache/jmeter/visualizers/RenderAsHTML.java

+3
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@
3333
import org.slf4j.Logger;
3434
import org.slf4j.LoggerFactory;
3535

36+
import com.google.auto.service.AutoService;
37+
38+
@AutoService(ResultRenderer.class)
3639
public class RenderAsHTML extends SamplerResultTab implements ResultRenderer {
3740
private static final Logger log = LoggerFactory.getLogger(RenderAsHTML.class);
3841

src/components/src/main/java/org/apache/jmeter/visualizers/RenderAsHTMLFormatted.java

+3
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@
2121
import org.apache.jmeter.util.JMeterUtils;
2222
import org.jsoup.Jsoup;
2323

24+
import com.google.auto.service.AutoService;
25+
26+
@AutoService(ResultRenderer.class)
2427
public class RenderAsHTMLFormatted extends SamplerResultTab implements ResultRenderer {
2528

2629
/** {@inheritDoc} */

src/components/src/main/java/org/apache/jmeter/visualizers/RenderAsHTMLWithEmbedded.java

+3
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020
import org.apache.jmeter.samplers.SampleResult;
2121
import org.apache.jmeter.util.JMeterUtils;
2222

23+
import com.google.auto.service.AutoService;
24+
25+
@AutoService(ResultRenderer.class)
2326
public class RenderAsHTMLWithEmbedded extends RenderAsHTML
2427
implements ResultRenderer {
2528

src/components/src/main/java/org/apache/jmeter/visualizers/RenderAsJSON.java

+3
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@
2929
import net.minidev.json.parser.JSONParser;
3030
import net.minidev.json.parser.ParseException;
3131

32+
import com.google.auto.service.AutoService;
33+
34+
@AutoService(ResultRenderer.class)
3235
public class RenderAsJSON extends SamplerResultTab implements ResultRenderer {
3336
private static final String TAB_SEPARATOR = " "; //$NON-NLS-1$
3437

src/components/src/main/java/org/apache/jmeter/visualizers/RenderAsRegexp.java

+3
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,12 @@
5050
import org.apache.oro.text.regex.Perl5Compiler;
5151
import org.apache.oro.text.regex.Perl5Matcher;
5252

53+
import com.google.auto.service.AutoService;
54+
5355
/**
5456
* Implement ResultsRender for Regexp tester
5557
*/
58+
@AutoService(ResultRenderer.class)
5659
public class RenderAsRegexp implements ResultRenderer, ActionListener {
5760

5861
private static final String REGEXP_TESTER_COMMAND = "regexp_tester"; // $NON-NLS-1$

src/components/src/main/java/org/apache/jmeter/visualizers/RenderAsText.java

+3
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020
import org.apache.jmeter.samplers.SampleResult;
2121
import org.apache.jmeter.util.JMeterUtils;
2222

23+
import com.google.auto.service.AutoService;
24+
25+
@AutoService(ResultRenderer.class)
2326
public class RenderAsText extends SamplerResultTab implements ResultRenderer {
2427

2528
/** {@inheritDoc} */

src/components/src/main/java/org/apache/jmeter/visualizers/RenderAsXML.java

+3
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@
5353
import org.w3c.tidy.Tidy;
5454
import org.xml.sax.SAXException;
5555

56+
import com.google.auto.service.AutoService;
57+
58+
@AutoService(ResultRenderer.class)
5659
public class RenderAsXML extends SamplerResultTab
5760
implements ResultRenderer {
5861

src/components/src/main/java/org/apache/jmeter/visualizers/RenderAsXPath.java

+3
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,13 @@
5959
import org.w3c.dom.Document;
6060
import org.xml.sax.SAXException;
6161

62+
import com.google.auto.service.AutoService;
63+
6264

6365
/**
6466
* Implement ResultsRender for XPath tester
6567
*/
68+
@AutoService(ResultRenderer.class)
6669
public class RenderAsXPath implements ResultRenderer, ActionListener {
6770

6871
private static final Logger log = LoggerFactory.getLogger(RenderAsXPath.class);

src/components/src/main/java/org/apache/jmeter/visualizers/RenderAsXPath2.java

+3
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,12 @@
4848
import org.slf4j.Logger;
4949
import org.slf4j.LoggerFactory;
5050

51+
import com.google.auto.service.AutoService;
52+
5153
/**
5254
* Implement ResultsRender for XPath tester
5355
*/
56+
@AutoService(ResultRenderer.class)
5457
public class RenderAsXPath2 implements ResultRenderer, ActionListener {
5558

5659
private static final Logger log = LoggerFactory.getLogger(RenderAsXPath2.class);

src/components/src/main/java/org/apache/jmeter/visualizers/RenderInBrowser.java

+3
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import javax.swing.JProgressBar;
2828
import javax.swing.SwingUtilities;
2929

30+
import com.google.auto.service.AutoService;
31+
3032
import org.apache.jmeter.samplers.SampleResult;
3133
import org.apache.jmeter.util.JMeterUtils;
3234

@@ -43,6 +45,7 @@
4345
* {@link ResultRenderer} implementation that uses JAVAFX WebEngine to render as browser do
4446
* @since 3.2
4547
*/
48+
@AutoService(ResultRenderer.class)
4649
public class RenderInBrowser extends SamplerResultTab implements ResultRenderer {
4750

4851
private JFXPanel jfxPanel;

0 commit comments

Comments
 (0)