Actually use TLS in (some) Maven tests and shove a few minutes from their execution
What's changed?
I enabled TLS support in OkHttp MockWebServer for some tests, in order to be able to reply with an actual HTTPS response.
On my machine, MavenPomDownloaderTest goes down from 1m15 to 18s, and MavenParserTest goes from 7min to 1min! (more on this minute below)
This can also serve as POC to be used in other tests.
What's your motivation?
Some time ago, I got curious about what was making those tests so slow, so investigated them. I had kept this on the side while working on other things but I thought it was still worth integrating.
Without TLS support, the MavenPomDownloader first tries HTTPS before HTTP. As MockWebServer does not expect this, it tries to parse the TLS handshake as an HTTP request line, and since it does not receive a \n, it just waits for it until the client times out, and then it logs an error:
Oct 18, 2024 10:32:23 PM okhttp3.mockwebserver.MockWebServer$SocketHandler handle
WARNING: MockWebServer[47261] connection from /127.0.0.1 didn't make a request
Oct 18, 2024 10:32:26 PM okhttp3.mockwebserver.MockWebServer$SocketHandler handle
WARNING: MockWebServer[39339] connection from /127.0.0.1 didn't make a request
Oct 18, 2024 10:32:26 PM okhttp3.mockwebserver.MockWebServer$serveConnection$$inlined$execute$default$1 runOnce
SEVERE: MockWebServer[39339] connection from /127.0.0.1 crashed
java.lang.StringIndexOutOfBoundsException: begin 0, end -1, length 24
at java.base/java.lang.String.checkBoundsBeginEnd(String.java:4608)
at java.base/java.lang.String.substring(String.java:2711)
at okhttp3.mockwebserver.RecordedRequest.<init>(RecordedRequest.kt:99)
at okhttp3.mockwebserver.MockWebServer.readRequest(MockWebServer.kt:751)
at okhttp3.mockwebserver.MockWebServer.access$readRequest(MockWebServer.kt:101)
at okhttp3.mockwebserver.MockWebServer$SocketHandler.processOneRequest(MockWebServer.kt:593)
at okhttp3.mockwebserver.MockWebServer$SocketHandler.handle(MockWebServer.kt:552)
at okhttp3.mockwebserver.MockWebServer$serveConnection$$inlined$execute$default$1.runOnce(TaskQueue.kt:220)
at okhttp3.internal.concurrent.TaskRunner.runTask(TaskRunner.kt:116)
at okhttp3.internal.concurrent.TaskRunner.access$runTask(TaskRunner.kt:42)
at okhttp3.internal.concurrent.TaskRunner$runnable$1.run(TaskRunner.kt:65)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:842)
See also the GitHub Actions log and search for occurrences of MavenParserTest to find occurrences of the above error. You’ll notice they are all from mirrorsAndAuth(). Now check the timestamps! :smirk:
By enabling HTTPS, we can avoid this timeout. As the client times out after 10s and retries multiple times, this can spare a lot of time.
Anything in particular you'd like reviewers to focus on?
MavenPomDownloaderTest
I reorganized this test class by grouping most tests between two @Nested classes: with and without TLS. The remaining 18s are due mostly to tests actually relying on the timeout/fallback on HTTP, or contacting online servers.
Side note: I did this a few weeks ago, I now noticed a small change in behavior from normalizeRepository(), since, I guess, #4506: it does not seem to set knownToExist to true after validating the URL. I don’t know if this was intended. (My original usesHttpsWhenAvailable() test was expecting it, now I removed that)
MavenParserTest
I only changed mirrorsAndAuth() which goes down from 6min to ~300ms. I actually didn’t remember it was originally so slow, the same test in this build from mid-september seems to have taken ~1min. I did my changes around Sep 24th, commit d2c825c845bf9bf3259d633956fb0688b342d36b, I still have my old branch if you are interested
I also didn’t remember about the remaining 1 minute, but I think something has changed in between… and it’s not OpenRewrite!
The prerequisite() test now takes a varying 1-2minutes alone! And this test does… nothing! It’s just a pom without parent and a single dependency: org.apache.maven.reporting:maven-reporting-api:3.0.
But that dependency has a transitive dependency: org.apache.maven.doxia:doxia-sink-api:1.0. If you follow from parent to parent, you end up with org.apache:apache:4 (from 2007 :sweat_smile:) and it declares a single repository: http://people.apache.org/repo/m2-snapshot-repository
At the moment I am writing these lines, HTTPS seems available on that domain (and HTTP even redirects to it), but requests time out. Indeed, since September 12th, they have shut down the service.
Maybe a different dependency should be used for this test?
Anyone you would like to review specifically?
@timtebeek
Have you considered any alternatives or workarounds?
The TLS setup could probably be centralized somewhere but I don’t think it is worth it until it gets used more broadly. Maybe a way to disable the HTTPS attempt in tests could be good.
Any additional context
The strategy of trying HTTPS first is actually inconsistent with Maven’s modern behavior. Since Maven 3.8.1, in order to fix CVE-2021-26291, Maven completely blocks HTTP repositories by default. I think OpenRewrite should do the same.
Moreover, OpenRewrite does not check if a port is specified in the URL (like with MockWebServer). If a port is specified in an HTTP URL, it does not make sense at all to try HTTPS on the same port! This was what was causing trouble with MockWebServer in the first place…
Checklist
- [x] I've added unit tests to cover both positive and negative cases
- [x] I've read and applied the recipe conventions and best practices
- [x] I've used the IntelliJ IDEA auto-formatter on affected files
Oh wow, thanks for the very detailed analysis and fix! Should be a great quality of life improvement to shave this much of the build time, even with tests in parallel. I also like the additional suggestions with regards to removing the dependency on people.apache.org, as indeed I don't think that's necessary and seems wasteful.
As to blocking http traffic at all; I'm not sure we can already make that switch, as we have a long tail of older projects to support still, especially in enterprises, and even have recipes to coach those away from using http repositories. I'm similarly on the fence about not trying https when a port is specified, just because outdated or misconfiguration is to be expected at scale, but perhaps others like @pstreef can chime in here as well.
I'm tempted to merge this already as I've come to trust your quality work, but as I'm away for the weekend and reviewing from mobile it's probably best to have a last look on my laptop by Monday before I merge. Either way thanks a lot already, really stand out work these improvements.
First: this is awesome! Thanks so much for this contribution and the detailed explanation.
Indeed the knownToExist change was intentional. It was only ever meant for well known repos like maven central.
As Tim said, we need to keep http support. The nature of the project is to upgrade code, so we need to support many older configurations to be able to handle as much old code as possible. And http is still used a lot.
I too am unable to review the code, but I read the description and am very happy with your results. Thanks again!
As Tim said, we need to keep http support. The nature of the project is to upgrade code, so we need to support many older configurations to be able to handle as much old code as possible. And http is still used a lot.
My idea would be to disable it by default, and have a configuration flag to re-enable it. That would be quite simple, even though it wouldn’t actually match what Maven does (and I don’t know about Gradle).
Also remember that a lot of people are using internal mirrors anyways, which may or may not be HTTPS, but it’s quite independent from the age of the project to migrate. I would assume people are progressively migrating to HTTPS (Maven 3.8.1 was released more than 3 years ago), so disabling it by default should be ok.
Take your time for the review, especially since I reorganized MavenPomDownloaderTest quite a bit. No need to do it over the weekend :slightly_smiling_face:
At the moment I am writing these lines, HTTPS seems available on that domain (and HTTP even redirects to it), but requests time out.
BTW people.apache.org replies today (but of course there is no repository there any more)
FYI, I was curious about why UpgradeParentVersionTest#nonMavenCentralRepository() takes 30s on my machine… well, it downloads the whole world, here are the list of calls it makes:
OPTIONS https://repo.jenkins-ci.org/public/
GET https://repo.jenkins-ci.org/public/org/jenkins-ci/plugins/plugin/4.33/plugin-4.33.pom
GET https://repo.jenkins-ci.org/public/org/jenkins-ci/main/jenkins-bom/2.249/jenkins-bom-2.249.pom
GET https://repo.jenkins-ci.org/public/org/jenkins-ci/main/jenkins-test-harness/1674.v3b8b1441e939/jenkins-test-harness-1674.v3b8b1441e939.pom
GET https://repo.jenkins-ci.org/public/org/jenkins-ci/test-annotations/1.4/test-annotations-1.4.pom
GET https://repo.jenkins-ci.org/public/org/eclipse/jetty/jetty-webapp/9.4.44.v20210927/jetty-webapp-9.4.44.v20210927.pom
GET https://repo.maven.apache.org/maven2/org/eclipse/jetty/jetty-webapp/9.4.44.v20210927/jetty-webapp-9.4.44.v20210927.pom
GET https://repo.jenkins-ci.org/public/org/eclipse/jetty/jetty-project/9.4.44.v20210927/jetty-project-9.4.44.v20210927.pom
GET https://repo.maven.apache.org/maven2/org/eclipse/jetty/jetty-project/9.4.44.v20210927/jetty-project-9.4.44.v20210927.pom
GET https://repo.jenkins-ci.org/public/org/junit/junit-bom/5.8.1/junit-bom-5.8.1.pom
GET https://repo.maven.apache.org/maven2/org/junit/junit-bom/5.8.1/junit-bom-5.8.1.pom
GET https://repo.jenkins-ci.org/public/org/eclipse/jetty/jetty-security/9.4.44.v20210927/jetty-security-9.4.44.v20210927.pom
GET https://repo.maven.apache.org/maven2/org/eclipse/jetty/jetty-security/9.4.44.v20210927/jetty-security-9.4.44.v20210927.pom
GET https://repo.jenkins-ci.org/public/org/eclipse/jetty/websocket/websocket-api/9.4.44.v20210927/websocket-api-9.4.44.v20210927.pom
GET https://repo.maven.apache.org/maven2/org/eclipse/jetty/websocket/websocket-api/9.4.44.v20210927/websocket-api-9.4.44.v20210927.pom
GET https://repo.jenkins-ci.org/public/org/eclipse/jetty/websocket/websocket-parent/9.4.44.v20210927/websocket-parent-9.4.44.v20210927.pom
GET https://repo.maven.apache.org/maven2/org/eclipse/jetty/websocket/websocket-parent/9.4.44.v20210927/websocket-parent-9.4.44.v20210927.pom
GET https://repo.jenkins-ci.org/public/org/eclipse/jetty/websocket/websocket-server/9.4.44.v20210927/websocket-server-9.4.44.v20210927.pom
GET https://repo.maven.apache.org/maven2/org/eclipse/jetty/websocket/websocket-server/9.4.44.v20210927/websocket-server-9.4.44.v20210927.pom
GET https://repo.jenkins-ci.org/public/org/jenkins-ci/main/jenkins-test-harness-htmlunit/66.v712ea44bccba/jenkins-test-harness-htmlunit-66.v712ea44bccba.pom
GET https://repo.jenkins-ci.org/public/org/jvnet/hudson/embedded-rhino-debugger/1.2/embedded-rhino-debugger-1.2.pom
GET https://repo.maven.apache.org/maven2/org/jvnet/hudson/embedded-rhino-debugger/1.2/embedded-rhino-debugger-1.2.pom
GET https://repo.jenkins-ci.org/public/org/jvnet/hudson/lib/1.7/lib-1.7.pom
GET https://repo.maven.apache.org/maven2/org/jvnet/hudson/lib/1.7/lib-1.7.pom
GET https://repo.jenkins-ci.org/public/org/jvnet/hudson/hudson/1.7/hudson-1.7.pom
GET https://repo.maven.apache.org/maven2/org/jvnet/hudson/hudson/1.7/hudson-1.7.pom
OPTIONS https://maven.glassfish.org/content/groups/public/
HEAD https://maven.glassfish.org/content/groups/public/
OPTIONS http://maven.glassfish.org/content/groups/public/
HEAD http://maven.glassfish.org/content/groups/public/
GET http://maven.glassfish.org/content/groups/public/org/jvnet/hudson/lib/1.7/lib-1.7.pom
GET http://maven.glassfish.org/content/groups/public/org/jvnet/hudson/hudson/1.7/hudson-1.7.pom
GET http://maven.glassfish.org/content/groups/public/org/jvnet/hudson/lib/1.7/lib-1.7.pom
GET http://maven.glassfish.org/content/groups/public/org/jvnet/hudson/hudson/1.7/hudson-1.7.pom
GET https://repo.jenkins-ci.org/public/io/jenkins/lib/support-log-formatter/1.1/support-log-formatter-1.1.pom
GET https://repo.jenkins-ci.org/public/org/netbeans/modules/org-netbeans-insane/RELEASE126/org-netbeans-insane-RELEASE126.pom
GET https://repo.maven.apache.org/maven2/org/netbeans/modules/org-netbeans-insane/RELEASE126/org-netbeans-insane-RELEASE126.pom
GET https://repo.jenkins-ci.org/public/org/apache/netbeans/netbeans-parent/2/netbeans-parent-2.pom
GET https://repo.maven.apache.org/maven2/org/apache/netbeans/netbeans-parent/2/netbeans-parent-2.pom
OPTIONS https://repository.apache.org/snapshots/
GET https://repo.jenkins-ci.org/public/org/openjdk/jmh/jmh-core/1.33/jmh-core-1.33.pom
GET https://repo.maven.apache.org/maven2/org/openjdk/jmh/jmh-core/1.33/jmh-core-1.33.pom
OPTIONS https://download.java.net/maven/2/
HEAD https://download.java.net/maven/2/
GET https://download.java.net/maven/2/org/openjdk/jmh/jmh-parent/1.33/jmh-parent-1.33.pom
GET https://repo.jenkins-ci.org/public/org/openjdk/jmh/jmh-parent/1.33/jmh-parent-1.33.pom
GET https://repo.maven.apache.org/maven2/org/openjdk/jmh/jmh-parent/1.33/jmh-parent-1.33.pom
GET https://repo.jenkins-ci.org/public/org/openjdk/jmh/jmh-generator-annprocess/1.33/jmh-generator-annprocess-1.33.pom
GET https://repo.maven.apache.org/maven2/org/openjdk/jmh/jmh-generator-annprocess/1.33/jmh-generator-annprocess-1.33.pom
GET https://repo.jenkins-ci.org/public/org/eclipse/jetty/jetty-xml/9.4.44.v20210927/jetty-xml-9.4.44.v20210927.pom
GET https://repo.maven.apache.org/maven2/org/eclipse/jetty/jetty-xml/9.4.44.v20210927/jetty-xml-9.4.44.v20210927.pom
GET https://repo.jenkins-ci.org/public/org/eclipse/jetty/jetty-servlet/9.4.44.v20210927/jetty-servlet-9.4.44.v20210927.pom
GET https://repo.maven.apache.org/maven2/org/eclipse/jetty/jetty-servlet/9.4.44.v20210927/jetty-servlet-9.4.44.v20210927.pom
GET https://repo.jenkins-ci.org/public/org/eclipse/jetty/jetty-server/9.4.44.v20210927/jetty-server-9.4.44.v20210927.pom
GET https://repo.maven.apache.org/maven2/org/eclipse/jetty/jetty-server/9.4.44.v20210927/jetty-server-9.4.44.v20210927.pom
GET https://repo.jenkins-ci.org/public/org/eclipse/jetty/websocket/websocket-common/9.4.44.v20210927/websocket-common-9.4.44.v20210927.pom
GET https://repo.maven.apache.org/maven2/org/eclipse/jetty/websocket/websocket-common/9.4.44.v20210927/websocket-common-9.4.44.v20210927.pom
GET https://repo.jenkins-ci.org/public/org/eclipse/jetty/websocket/websocket-client/9.4.44.v20210927/websocket-client-9.4.44.v20210927.pom
GET https://repo.maven.apache.org/maven2/org/eclipse/jetty/websocket/websocket-client/9.4.44.v20210927/websocket-client-9.4.44.v20210927.pom
GET https://repo.jenkins-ci.org/public/org/eclipse/jetty/websocket/websocket-servlet/9.4.44.v20210927/websocket-servlet-9.4.44.v20210927.pom
GET https://repo.maven.apache.org/maven2/org/eclipse/jetty/websocket/websocket-servlet/9.4.44.v20210927/websocket-servlet-9.4.44.v20210927.pom
GET https://repo.jenkins-ci.org/public/org/eclipse/jetty/jetty-http/9.4.44.v20210927/jetty-http-9.4.44.v20210927.pom
GET https://repo.maven.apache.org/maven2/org/eclipse/jetty/jetty-http/9.4.44.v20210927/jetty-http-9.4.44.v20210927.pom
GET https://repo.jenkins-ci.org/public/xalan/serializer/2.7.2/serializer-2.7.2.pom
GET https://repo.maven.apache.org/maven2/xalan/serializer/2.7.2/serializer-2.7.2.pom
OPTIONS https://people.apache.org/repo/m2-snapshot-repository/
GET https://repo.jenkins-ci.org/public/xml-apis/xml-apis/1.4.01/xml-apis-1.4.01.pom
GET https://repo.maven.apache.org/maven2/xml-apis/xml-apis/1.4.01/xml-apis-1.4.01.pom
GET https://repo.jenkins-ci.org/public/commons-net/commons-net/3.8.0/commons-net-3.8.0.pom
GET https://repo.maven.apache.org/maven2/commons-net/commons-net/3.8.0/commons-net-3.8.0.pom
GET https://repo.jenkins-ci.org/public/org/brotli/dec/0.1.2/dec-0.1.2.pom
GET https://repo.maven.apache.org/maven2/org/brotli/dec/0.1.2/dec-0.1.2.pom
GET https://repo.jenkins-ci.org/public/org/brotli/parent/0.1.2/parent-0.1.2.pom
GET https://repo.maven.apache.org/maven2/org/brotli/parent/0.1.2/parent-0.1.2.pom
GET https://repo.jenkins-ci.org/public/com/shapesecurity/salvation2/3.0.0/salvation2-3.0.0.pom
GET https://repo.maven.apache.org/maven2/com/shapesecurity/salvation2/3.0.0/salvation2-3.0.0.pom
GET https://repo.jenkins-ci.org/public/net/sf/jopt-simple/jopt-simple/4.6/jopt-simple-4.6.pom
GET https://repo.maven.apache.org/maven2/net/sf/jopt-simple/jopt-simple/4.6/jopt-simple-4.6.pom
OPTIONS https://oss.sonatype.org/content/repositories/snapshots/
GET https://repo.jenkins-ci.org/public/org/apache/commons/commons-math3/3.2/commons-math3-3.2.pom
GET https://repo.maven.apache.org/maven2/org/apache/commons/commons-math3/3.2/commons-math3-3.2.pom
OPTIONS https://repository.apache.org/snapshots/
GET https://repo.jenkins-ci.org/public/org/eclipse/jetty/jetty-util/9.4.44.v20210927/jetty-util-9.4.44.v20210927.pom
GET https://repo.maven.apache.org/maven2/org/eclipse/jetty/jetty-util/9.4.44.v20210927/jetty-util-9.4.44.v20210927.pom
GET https://repo.jenkins-ci.org/public/org/eclipse/jetty/jetty-util-ajax/9.4.44.v20210927/jetty-util-ajax-9.4.44.v20210927.pom
GET https://repo.maven.apache.org/maven2/org/eclipse/jetty/jetty-util-ajax/9.4.44.v20210927/jetty-util-ajax-9.4.44.v20210927.pom
OPTIONS https://download.java.net/maven/glassfish/
HEAD https://download.java.net/maven/glassfish/
OPTIONS https://maven.java.net/content/repositories/snapshots/
GET https://repo.jenkins-ci.org/public/org/eclipse/jetty/jetty-io/9.4.44.v20210927/jetty-io-9.4.44.v20210927.pom
GET https://repo.maven.apache.org/maven2/org/eclipse/jetty/jetty-io/9.4.44.v20210927/jetty-io-9.4.44.v20210927.pom
GET https://repo.jenkins-ci.org/public/org/eclipse/jetty/jetty-client/9.4.44.v20210927/jetty-client-9.4.44.v20210927.pom
GET https://repo.maven.apache.org/maven2/org/eclipse/jetty/jetty-client/9.4.44.v20210927/jetty-client-9.4.44.v20210927.pom
GET https://repo.jenkins-ci.org/public/org/jenkins-ci/main/jenkins-core/2.249/jenkins-core-2.249.pom
GET https://repo.jenkins-ci.org/public/org/codehaus/mojo/animal-sniffer-annotations/1.20/animal-sniffer-annotations-1.20.pom
GET https://repo.maven.apache.org/maven2/org/codehaus/mojo/animal-sniffer-annotations/1.20/animal-sniffer-annotations-1.20.pom
GET https://repo.jenkins-ci.org/public/org/codehaus/mojo/animal-sniffer-parent/1.20/animal-sniffer-parent-1.20.pom
GET https://repo.maven.apache.org/maven2/org/codehaus/mojo/animal-sniffer-parent/1.20/animal-sniffer-parent-1.20.pom
GET https://repo.jenkins-ci.org/public/org/codehaus/mojo/mojo-parent/61/mojo-parent-61.pom
GET https://repo.maven.apache.org/maven2/org/codehaus/mojo/mojo-parent/61/mojo-parent-61.pom
OPTIONS https://oss.sonatype.org/content/repositories/snapshots/
GET https://repo.jenkins-ci.org/public/org/jenkins-ci/plugins/icon-shim/icon-set/1.0.5/icon-set-1.0.5.pom
GET https://repo.jenkins-ci.org/public/org/jenkins-ci/plugins/icon-shim/icon-shim-pom/1.0.5/icon-shim-pom-1.0.5.pom
GET https://repo.jenkins-ci.org/public/org/jenkins-ci/plugins/plugin/1.520/plugin-1.520.pom
GET https://repo.jenkins-ci.org/public/org/jenkins-ci/jenkins/1.31/jenkins-1.31.pom
GET https://repo.jenkins-ci.org/public/org/jenkins-ci/main/remoting/4.5/remoting-4.5.pom
GET https://repo.jenkins-ci.org/public/org/jenkins-ci/main/cli/2.249/cli-2.249.pom
GET https://repo.jenkins-ci.org/public/org/jenkins-ci/version-number/1.7/version-number-1.7.pom
GET https://repo.jenkins-ci.org/public/org/jenkins-ci/jenkins/1.52/jenkins-1.52.pom
GET https://repo.jenkins-ci.org/public/org/jenkins-ci/crypto-util/1.5/crypto-util-1.5.pom
GET https://repo.jenkins-ci.org/public/org/jenkins-ci/jenkins/1.54/jenkins-1.54.pom
GET https://repo.jenkins-ci.org/public/org/jvnet/hudson/jtidy/4aug2000r7-dev-hudson-1/jtidy-4aug2000r7-dev-hudson-1.pom
GET https://repo.maven.apache.org/maven2/org/jvnet/hudson/jtidy/4aug2000r7-dev-hudson-1/jtidy-4aug2000r7-dev-hudson-1.pom
GET https://repo.jenkins-ci.org/public/com/google/inject/guice/4.0/guice-4.0.pom
GET https://repo.maven.apache.org/maven2/com/google/inject/guice/4.0/guice-4.0.pom
GET https://repo.jenkins-ci.org/public/org/connectbot/jbcrypt/jbcrypt/1.0.0/jbcrypt-1.0.0.pom
GET https://repo.jenkins-ci.org/public/org/jruby/ext/posix/jna-posix/1.0.3-jenkins-1/jna-posix-1.0.3-jenkins-1.pom
GET https://repo.jenkins-ci.org/public/com/github/jnr/jnr-posix/3.0.45/jnr-posix-3.0.45.pom
GET https://repo.maven.apache.org/maven2/com/github/jnr/jnr-posix/3.0.45/jnr-posix-3.0.45.pom
GET https://repo.jenkins-ci.org/public/org/kohsuke/stapler/stapler-groovy/1.260/stapler-groovy-1.260.pom
GET https://repo.maven.apache.org/maven2/org/kohsuke/stapler/stapler-groovy/1.260/stapler-groovy-1.260.pom
GET https://repo.jenkins-ci.org/public/org/kohsuke/stapler/stapler-jrebel/1.260/stapler-jrebel-1.260.pom
GET https://repo.maven.apache.org/maven2/org/kohsuke/stapler/stapler-jrebel/1.260/stapler-jrebel-1.260.pom
GET https://repo.jenkins-ci.org/public/org/kohsuke/windows-package-checker/1.2/windows-package-checker-1.2.pom
GET https://repo.maven.apache.org/maven2/org/kohsuke/windows-package-checker/1.2/windows-package-checker-1.2.pom
GET https://repo.jenkins-ci.org/public/org/kohsuke/pom/14/pom-14.pom
GET https://repo.maven.apache.org/maven2/org/kohsuke/pom/14/pom-14.pom
GET https://repo.jenkins-ci.org/public/org/kohsuke/stapler/stapler-adjunct-zeroclipboard/1.3.5-1/stapler-adjunct-zeroclipboard-1.3.5-1.pom
GET https://repo.maven.apache.org/maven2/org/kohsuke/stapler/stapler-adjunct-zeroclipboard/1.3.5-1/stapler-adjunct-zeroclipboard-1.3.5-1.pom
OPTIONS https://repo.jenkins-ci.org/public/
GET https://repo.jenkins-ci.org/public/org/kohsuke/pom/4/pom-4.pom
GET https://repo.maven.apache.org/maven2/org/kohsuke/pom/4/pom-4.pom
GET https://repo.jenkins-ci.org/public/org/kohsuke/stapler/stapler-adjunct-timeline/1.5/stapler-adjunct-timeline-1.5.pom
GET https://repo.maven.apache.org/maven2/org/kohsuke/stapler/stapler-adjunct-timeline/1.5/stapler-adjunct-timeline-1.5.pom
OPTIONS https://maven.glassfish.org/content/groups/public/
HEAD https://maven.glassfish.org/content/groups/public/
OPTIONS http://maven.glassfish.org/content/groups/public/
HEAD http://maven.glassfish.org/content/groups/public/
GET http://maven.glassfish.org/content/groups/public/org/kohsuke/pom/14/pom-14.pom
GET http://maven.glassfish.org/content/groups/public/org/kohsuke/pom/14/pom-14.pom
GET http://maven.glassfish.org/content/groups/public/org/kohsuke/pom/14/pom-14.pom
GET https://repo.jenkins-ci.org/public/org/kohsuke/stapler/stapler-adjunct-codemirror/1.3/stapler-adjunct-codemirror-1.3.pom
GET https://repo.jenkins-ci.org/public/io/jenkins/stapler/jenkins-stapler-support/1.1/jenkins-stapler-support-1.1.pom
GET https://repo.jenkins-ci.org/public/org/jenkins-ci/jenkins/1.49/jenkins-1.49.pom
GET https://repo.jenkins-ci.org/public/com/infradna/tool/bridge-method-annotation/1.13/bridge-method-annotation-1.13.pom
GET https://repo.maven.apache.org/maven2/com/infradna/tool/bridge-method-annotation/1.13/bridge-method-annotation-1.13.pom
GET https://repo.jenkins-ci.org/public/com/infradna/tool/bridge-method-injector-parent/1.13/bridge-method-injector-parent-1.13.pom
GET https://repo.maven.apache.org/maven2/com/infradna/tool/bridge-method-injector-parent/1.13/bridge-method-injector-parent-1.13.pom
GET https://repo.jenkins-ci.org/public/org/kohsuke/stapler/json-lib/2.4-jenkins-2/json-lib-2.4-jenkins-2.pom
GET https://repo.jenkins-ci.org/public/commons-httpclient/commons-httpclient/3.1-jenkins-1/commons-httpclient-3.1-jenkins-1.pom
GET https://repo.jenkins-ci.org/public/org/jenkins-ci/jenkins/1.39/jenkins-1.39.pom
GET https://repo.jenkins-ci.org/public/args4j/args4j/2.33/args4j-2.33.pom
GET https://repo.maven.apache.org/maven2/args4j/args4j/2.33/args4j-2.33.pom
GET https://repo.jenkins-ci.org/public/args4j/args4j-site/2.33/args4j-site-2.33.pom
GET https://repo.maven.apache.org/maven2/args4j/args4j-site/2.33/args4j-site-2.33.pom
GET https://repo.jenkins-ci.org/public/org/jenkins-ci/annotation-indexer/1.12/annotation-indexer-1.12.pom
GET https://repo.jenkins-ci.org/public/org/jenkins-ci/jenkins/1.37/jenkins-1.37.pom
GET https://repo.jenkins-ci.org/public/org/jenkins-ci/bytecode-compatibility-transformer/2.0-beta-2/bytecode-compatibility-transformer-2.0-beta-2.pom
GET https://repo.jenkins-ci.org/public/org/jenkins-ci/main/bct/bct-parent-pom/2.0-beta-2/bct-parent-pom-2.0-beta-2.pom
GET https://repo.jenkins-ci.org/public/org/jenkins-ci/jenkins/1.46/jenkins-1.46.pom
GET https://repo.jenkins-ci.org/public/org/jenkins-ci/task-reactor/1.5/task-reactor-1.5.pom
GET https://repo.jenkins-ci.org/public/org/jvnet/localizer/localizer/1.26/localizer-1.26.pom
GET https://repo.jenkins-ci.org/public/org/jvnet/localizer/localizer-parent/1.26/localizer-parent-1.26.pom
GET https://repo.jenkins-ci.org/public/antlr/antlr/2.7.6/antlr-2.7.6.pom
GET https://repo.maven.apache.org/maven2/antlr/antlr/2.7.6/antlr-2.7.6.pom
GET https://repo.jenkins-ci.org/public/org/jvnet/hudson/xstream/1.4.7-jenkins-1/xstream-1.4.7-jenkins-1.pom
GET https://repo.jenkins-ci.org/public/com/thoughtworks/xstream/xstream-parent/1.4.7/xstream-parent-1.4.7.pom
GET https://repo.maven.apache.org/maven2/com/thoughtworks/xstream/xstream-parent/1.4.7/xstream-parent-1.4.7.pom
GET https://repo.jenkins-ci.org/public/org/codehaus/codehaus-parent/3/codehaus-parent-3.pom
GET https://repo.maven.apache.org/maven2/org/codehaus/codehaus-parent/3/codehaus-parent-3.pom
OPTIONS https://nexus.codehaus.org/snapshots/
HEAD https://nexus.codehaus.org/snapshots/
OPTIONS http://nexus.codehaus.org/snapshots/
HEAD http://nexus.codehaus.org/snapshots/
GET https://repo.jenkins-ci.org/public/xpp3/xpp3/1.1.4c/xpp3-1.1.4c.pom
GET https://repo.maven.apache.org/maven2/xpp3/xpp3/1.1.4c/xpp3-1.1.4c.pom
GET https://repo.jenkins-ci.org/public/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.pom
GET https://repo.maven.apache.org/maven2/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.pom
GET https://repo.jenkins-ci.org/public/org/jfree/jfreechart/1.0.19/jfreechart-1.0.19.pom
GET https://repo.maven.apache.org/maven2/org/jfree/jfreechart/1.0.19/jfreechart-1.0.19.pom
GET https://repo.jenkins-ci.org/public/org/apache/ant/ant/1.10.8/ant-1.10.8.pom
GET https://repo.maven.apache.org/maven2/org/apache/ant/ant/1.10.8/ant-1.10.8.pom
GET https://repo.jenkins-ci.org/public/org/apache/ant/ant-parent/1.10.8/ant-parent-1.10.8.pom
GET https://repo.maven.apache.org/maven2/org/apache/ant/ant-parent/1.10.8/ant-parent-1.10.8.pom
GET https://repo.jenkins-ci.org/public/commons-beanutils/commons-beanutils/1.9.3/commons-beanutils-1.9.3.pom
GET https://repo.maven.apache.org/maven2/commons-beanutils/commons-beanutils/1.9.3/commons-beanutils-1.9.3.pom
GET https://repo.jenkins-ci.org/public/com/sun/mail/jakarta.mail/1.6.5/jakarta.mail-1.6.5.pom
GET https://repo.maven.apache.org/maven2/com/sun/mail/jakarta.mail/1.6.5/jakarta.mail-1.6.5.pom
GET https://repo.jenkins-ci.org/public/com/sun/mail/all/1.6.5/all-1.6.5.pom
GET https://repo.maven.apache.org/maven2/com/sun/mail/all/1.6.5/all-1.6.5.pom
GET https://repo.jenkins-ci.org/public/jaxen/jaxen/1.1-beta-11/jaxen-1.1-beta-11.pom
GET https://repo.maven.apache.org/maven2/jaxen/jaxen/1.1-beta-11/jaxen-1.1-beta-11.pom
GET https://repo.jenkins-ci.org/public/commons-jelly/commons-jelly-tags-fmt/1.0/commons-jelly-tags-fmt-1.0.pom
GET https://repo.maven.apache.org/maven2/commons-jelly/commons-jelly-tags-fmt/1.0/commons-jelly-tags-fmt-1.0.pom
GET https://repo.jenkins-ci.org/public/commons-jelly/commons-jelly-tags-xml/1.1/commons-jelly-tags-xml-1.1.pom
GET https://repo.maven.apache.org/maven2/commons-jelly/commons-jelly-tags-xml/1.1/commons-jelly-tags-xml-1.1.pom
GET https://repo.jenkins-ci.org/public/org/jvnet/hudson/commons-jelly-tags-define/1.0.1-hudson-20071021/commons-jelly-tags-define-1.0.1-hudson-20071021.pom
GET https://repo.maven.apache.org/maven2/org/jvnet/hudson/commons-jelly-tags-define/1.0.1-hudson-20071021/commons-jelly-tags-define-1.0.1-hudson-20071021.pom
GET https://repo.jenkins-ci.org/public/org/jenkins-ci/commons-jexl/1.1-jenkins-20111212/commons-jexl-1.1-jenkins-20111212.pom
GET https://repo.jenkins-ci.org/public/org/acegisecurity/acegi-security/1.0.7/acegi-security-1.0.7.pom
GET https://repo.maven.apache.org/maven2/org/acegisecurity/acegi-security/1.0.7/acegi-security-1.0.7.pom
GET https://repo.jenkins-ci.org/public/org/acegisecurity/acegi-security-parent/1.0.7/acegi-security-parent-1.0.7.pom
GET https://repo.maven.apache.org/maven2/org/acegisecurity/acegi-security-parent/1.0.7/acegi-security-parent-1.0.7.pom
OPTIONS https://acegisecurity.sourceforge.net/repository/snapshots/
GET https://repo.jenkins-ci.org/public/org/codehaus/groovy/groovy-all/2.4.12/groovy-all-2.4.12.pom
GET https://repo.maven.apache.org/maven2/org/codehaus/groovy/groovy-all/2.4.12/groovy-all-2.4.12.pom
GET https://repo.jenkins-ci.org/public/jline/jline/2.12/jline-2.12.pom
GET https://repo.maven.apache.org/maven2/jline/jline/2.12/jline-2.12.pom
GET https://repo.jenkins-ci.org/public/org/fusesource/jansi/jansi/1.11/jansi-1.11.pom
GET https://repo.maven.apache.org/maven2/org/fusesource/jansi/jansi/1.11/jansi-1.11.pom
GET https://repo.jenkins-ci.org/public/org/fusesource/jansi/jansi-project/1.11/jansi-project-1.11.pom
GET https://repo.maven.apache.org/maven2/org/fusesource/jansi/jansi-project/1.11/jansi-project-1.11.pom
GET https://repo.jenkins-ci.org/public/org/fusesource/fusesource-pom/1.8/fusesource-pom-1.8.pom
GET https://repo.maven.apache.org/maven2/org/fusesource/fusesource-pom/1.8/fusesource-pom-1.8.pom
GET https://repo.jenkins-ci.org/public/org/springframework/spring-webmvc/2.5.6.SEC03/spring-webmvc-2.5.6.SEC03.pom
GET https://repo.maven.apache.org/maven2/org/springframework/spring-webmvc/2.5.6.SEC03/spring-webmvc-2.5.6.SEC03.pom
GET https://repo.jenkins-ci.org/public/org/springframework/spring-core/2.5.6.SEC03/spring-core-2.5.6.SEC03.pom
GET https://repo.maven.apache.org/maven2/org/springframework/spring-core/2.5.6.SEC03/spring-core-2.5.6.SEC03.pom
GET https://repo.jenkins-ci.org/public/org/springframework/spring-aop/2.5.6.SEC03/spring-aop-2.5.6.SEC03.pom
GET https://repo.maven.apache.org/maven2/org/springframework/spring-aop/2.5.6.SEC03/spring-aop-2.5.6.SEC03.pom
GET https://repo.jenkins-ci.org/public/jakarta/servlet/jsp/jstl/jakarta.servlet.jsp.jstl-api/1.2.7/jakarta.servlet.jsp.jstl-api-1.2.7.pom
GET https://repo.maven.apache.org/maven2/jakarta/servlet/jsp/jstl/jakarta.servlet.jsp.jstl-api/1.2.7/jakarta.servlet.jsp.jstl-api-1.2.7.pom
GET https://repo.jenkins-ci.org/public/com/sun/xml/txw2/txw2/20110809/txw2-20110809.pom
GET https://repo.maven.apache.org/maven2/com/sun/xml/txw2/txw2/20110809/txw2-20110809.pom
GET https://repo.jenkins-ci.org/public/com/sun/xml/txw2/txw2-project/20110809/txw2-project-20110809.pom
GET https://repo.maven.apache.org/maven2/com/sun/xml/txw2/txw2-project/20110809/txw2-project-20110809.pom
GET https://repo.jenkins-ci.org/public/org/jvnet/winp/winp/1.28/winp-1.28.pom
GET https://repo.maven.apache.org/maven2/org/jvnet/winp/winp/1.28/winp-1.28.pom
GET https://repo.jenkins-ci.org/public/org/kohsuke/pom/17/pom-17.pom
GET https://repo.maven.apache.org/maven2/org/kohsuke/pom/17/pom-17.pom
GET https://repo.jenkins-ci.org/public/org/jenkins-ci/memory-monitor/1.9/memory-monitor-1.9.pom
GET https://repo.jenkins-ci.org/public/org/jenkins-ci/jenkins/1.33/jenkins-1.33.pom
GET https://repo.jenkins-ci.org/public/org/codehaus/woodstox/wstx-asl/3.2.9/wstx-asl-3.2.9.pom
GET https://repo.maven.apache.org/maven2/org/codehaus/woodstox/wstx-asl/3.2.9/wstx-asl-3.2.9.pom
GET https://repo.jenkins-ci.org/public/net/java/dev/jna/jna/5.3.1/jna-5.3.1.pom
GET https://repo.maven.apache.org/maven2/net/java/dev/jna/jna/5.3.1/jna-5.3.1.pom
GET https://repo.jenkins-ci.org/public/org/kohsuke/akuma/1.10/akuma-1.10.pom
GET https://repo.maven.apache.org/maven2/org/kohsuke/akuma/1.10/akuma-1.10.pom
GET https://repo.jenkins-ci.org/public/org/kohsuke/pom/2/pom-2.pom
GET https://repo.maven.apache.org/maven2/org/kohsuke/pom/2/pom-2.pom
GET https://repo.jenkins-ci.org/public/org/kohsuke/libpam4j/1.11/libpam4j-1.11.pom
GET https://repo.maven.apache.org/maven2/org/kohsuke/libpam4j/1.11/libpam4j-1.11.pom
GET https://repo.jenkins-ci.org/public/org/kohsuke/libzfs/0.8/libzfs-0.8.pom
GET https://repo.maven.apache.org/maven2/org/kohsuke/libzfs/0.8/libzfs-0.8.pom
GET https://repo.jenkins-ci.org/public/com/sun/solaris/embedded_su4j/1.1/embedded_su4j-1.1.pom
GET https://repo.maven.apache.org/maven2/com/sun/solaris/embedded_su4j/1.1/embedded_su4j-1.1.pom
GET https://repo.jenkins-ci.org/public/net/java/sezpoz/sezpoz/1.13/sezpoz-1.13.pom
GET https://repo.maven.apache.org/maven2/net/java/sezpoz/sezpoz/1.13/sezpoz-1.13.pom
GET https://repo.jenkins-ci.org/public/net/java/sezpoz/pom/1.13/pom-1.13.pom
GET https://repo.maven.apache.org/maven2/net/java/sezpoz/pom/1.13/pom-1.13.pom
GET https://repo.jenkins-ci.org/public/org/kohsuke/jinterop/j-interop/2.0.6-kohsuke-1/j-interop-2.0.6-kohsuke-1.pom
GET https://repo.maven.apache.org/maven2/org/kohsuke/jinterop/j-interop/2.0.6-kohsuke-1/j-interop-2.0.6-kohsuke-1.pom
GET https://repo.jenkins-ci.org/public/org/kohsuke/jinterop/j-interop-parent/2.0.6-kohsuke-1/j-interop-parent-2.0.6-kohsuke-1.pom
GET https://repo.maven.apache.org/maven2/org/kohsuke/jinterop/j-interop-parent/2.0.6-kohsuke-1/j-interop-parent-2.0.6-kohsuke-1.pom
OPTIONS https://download.java.net/maven/2/
HEAD https://download.java.net/maven/2/
GET https://download.java.net/maven/2/org/kohsuke/jinterop/j-interop-parent/2.0.6-kohsuke-1/j-interop-parent-2.0.6-kohsuke-1.pom
GET https://repo.jenkins-ci.org/public/org/jvnet/robust-http-client/robust-http-client/1.2/robust-http-client-1.2.pom
GET https://repo.jenkins-ci.org/public/org/jenkins-ci/symbol-annotation/1.1/symbol-annotation-1.1.pom
GET https://repo.jenkins-ci.org/public/commons-codec/commons-codec/1.14/commons-codec-1.14.pom
GET https://repo.maven.apache.org/maven2/commons-codec/commons-codec/1.14/commons-codec-1.14.pom
GET https://repo.jenkins-ci.org/public/org/kohsuke/access-modifier-annotation/1.16/access-modifier-annotation-1.16.pom
GET https://repo.maven.apache.org/maven2/org/kohsuke/access-modifier-annotation/1.16/access-modifier-annotation-1.16.pom
GET https://repo.jenkins-ci.org/public/org/kohsuke/access-modifier/1.16/access-modifier-1.16.pom
GET https://repo.maven.apache.org/maven2/org/kohsuke/access-modifier/1.16/access-modifier-1.16.pom
GET https://repo.jenkins-ci.org/public/org/kohsuke/pom/19/pom-19.pom
GET https://repo.maven.apache.org/maven2/org/kohsuke/pom/19/pom-19.pom
GET https://repo.jenkins-ci.org/public/commons-fileupload/commons-fileupload/1.3.1-jenkins-2/commons-fileupload-1.3.1-jenkins-2.pom
GET https://repo.jenkins-ci.org/public/com/google/guava/guava/11.0.1/guava-11.0.1.pom
GET https://repo.maven.apache.org/maven2/com/google/guava/guava/11.0.1/guava-11.0.1.pom
GET https://repo.jenkins-ci.org/public/com/google/guava/guava-parent/11.0.1/guava-parent-11.0.1.pom
GET https://repo.maven.apache.org/maven2/com/google/guava/guava-parent/11.0.1/guava-parent-11.0.1.pom
GET https://repo.jenkins-ci.org/public/com/jcraft/jzlib/1.1.3-kohsuke-1/jzlib-1.1.3-kohsuke-1.pom
GET https://repo.jenkins-ci.org/public/com/github/jnr/jnr-ffi/2.1.8/jnr-ffi-2.1.8.pom
GET https://repo.maven.apache.org/maven2/com/github/jnr/jnr-ffi/2.1.8/jnr-ffi-2.1.8.pom
GET https://repo.jenkins-ci.org/public/com/github/jnr/jnr-constants/0.9.9/jnr-constants-0.9.9.pom
GET https://repo.maven.apache.org/maven2/com/github/jnr/jnr-constants/0.9.9/jnr-constants-0.9.9.pom
GET https://repo.jenkins-ci.org/public/org/kohsuke/stapler/stapler-jelly/1.260/stapler-jelly-1.260.pom
GET https://repo.maven.apache.org/maven2/org/kohsuke/stapler/stapler-jelly/1.260/stapler-jelly-1.260.pom
GET https://repo.jenkins-ci.org/public/org/kohsuke/stapler/stapler/1.260/stapler-1.260.pom
GET https://repo.maven.apache.org/maven2/org/kohsuke/stapler/stapler/1.260/stapler-1.260.pom
GET https://repo.jenkins-ci.org/public/net/sf/ezmorph/ezmorph/1.0.6/ezmorph-1.0.6.pom
GET https://repo.maven.apache.org/maven2/net/sf/ezmorph/ezmorph/1.0.6/ezmorph-1.0.6.pom
GET https://repo.jenkins-ci.org/public/org/kohsuke/asm6/6.2/asm6-6.2.pom
GET https://repo.maven.apache.org/maven2/org/kohsuke/asm6/6.2/asm6-6.2.pom
GET https://repo.jenkins-ci.org/public/org/jenkins-ci/constant-pool-scanner/1.2/constant-pool-scanner-1.2.pom
GET https://repo.maven.apache.org/maven2/org/jenkins-ci/constant-pool-scanner/1.2/constant-pool-scanner-1.2.pom
GET https://repo.jenkins-ci.org/public/org/jfree/jcommon/1.0.23/jcommon-1.0.23.pom
GET https://repo.maven.apache.org/maven2/org/jfree/jcommon/1.0.23/jcommon-1.0.23.pom
GET https://repo.jenkins-ci.org/public/org/apache/ant/ant-launcher/1.10.8/ant-launcher-1.10.8.pom
GET https://repo.maven.apache.org/maven2/org/apache/ant/ant-launcher/1.10.8/ant-launcher-1.10.8.pom
GET https://repo.jenkins-ci.org/public/com/sun/activation/jakarta.activation/1.2.1/jakarta.activation-1.2.1.pom
GET https://repo.maven.apache.org/maven2/com/sun/activation/jakarta.activation/1.2.1/jakarta.activation-1.2.1.pom
GET https://repo.jenkins-ci.org/public/xerces/xerces/2.2.1/xerces-2.2.1.pom
GET https://repo.maven.apache.org/maven2/xerces/xerces/2.2.1/xerces-2.2.1.pom
GET https://repo.jenkins-ci.org/public/org/jvnet/hudson/commons-jelly/1.1-hudson-20071021/commons-jelly-1.1-hudson-20071021.pom
GET https://repo.maven.apache.org/maven2/org/jvnet/hudson/commons-jelly/1.1-hudson-20071021/commons-jelly-1.1-hudson-20071021.pom
GET https://repo.jenkins-ci.org/public/org/springframework/spring-jdbc/1.2.9/spring-jdbc-1.2.9.pom
GET https://repo.maven.apache.org/maven2/org/springframework/spring-jdbc/1.2.9/spring-jdbc-1.2.9.pom
GET https://repo.jenkins-ci.org/public/org/springframework/spring-beans/2.5.6.SEC03/spring-beans-2.5.6.SEC03.pom
GET https://repo.maven.apache.org/maven2/org/springframework/spring-beans/2.5.6.SEC03/spring-beans-2.5.6.SEC03.pom
GET https://repo.jenkins-ci.org/public/org/springframework/spring-context/2.5.6.SEC03/spring-context-2.5.6.SEC03.pom
GET https://repo.maven.apache.org/maven2/org/springframework/spring-context/2.5.6.SEC03/spring-context-2.5.6.SEC03.pom
GET https://repo.jenkins-ci.org/public/org/springframework/spring-context-support/2.5.6.SEC03/spring-context-support-2.5.6.SEC03.pom
GET https://repo.maven.apache.org/maven2/org/springframework/spring-context-support/2.5.6.SEC03/spring-context-support-2.5.6.SEC03.pom
GET https://repo.jenkins-ci.org/public/org/springframework/spring-web/2.5.6.SEC03/spring-web-2.5.6.SEC03.pom
GET https://repo.maven.apache.org/maven2/org/springframework/spring-web/2.5.6.SEC03/spring-web-2.5.6.SEC03.pom
GET https://repo.jenkins-ci.org/public/relaxngDatatype/relaxngDatatype/20020414/relaxngDatatype-20020414.pom
GET https://repo.maven.apache.org/maven2/relaxngDatatype/relaxngDatatype/20020414/relaxngDatatype-20020414.pom
GET https://repo.jenkins-ci.org/public/stax/stax-api/1.0.1/stax-api-1.0.1.pom
GET https://repo.maven.apache.org/maven2/stax/stax-api/1.0.1/stax-api-1.0.1.pom
GET https://repo.jenkins-ci.org/public/org/kohsuke/jinterop/j-interopdeps/2.0.6-kohsuke-1/j-interopdeps-2.0.6-kohsuke-1.pom
GET https://repo.maven.apache.org/maven2/org/kohsuke/jinterop/j-interopdeps/2.0.6-kohsuke-1/j-interopdeps-2.0.6-kohsuke-1.pom
GET https://repo.jenkins-ci.org/public/com/github/jnr/jffi/1.2.17/jffi-1.2.17.pom
GET https://repo.maven.apache.org/maven2/com/github/jnr/jffi/1.2.17/jffi-1.2.17.pom
OPTIONS https://repository.ow2.org/nexus/content/repositories/snapshots/
GET https://repo.jenkins-ci.org/public/org/jenkins-ci/commons-jelly/1.1-jenkins-20120928/commons-jelly-1.1-jenkins-20120928.pom
GET https://repo.jenkins-ci.org/public/commons-discovery/commons-discovery/0.4/commons-discovery-0.4.pom
GET https://repo.maven.apache.org/maven2/commons-discovery/commons-discovery/0.4/commons-discovery-0.4.pom
GET https://repo.jenkins-ci.org/public/org/jvnet/tiger-types/2.2/tiger-types-2.2.pom
GET https://repo.jenkins-ci.org/public/org/kohsuke/asm5/5.0.1/asm5-5.0.1.pom
GET https://repo.maven.apache.org/maven2/org/kohsuke/asm5/5.0.1/asm5-5.0.1.pom
GET https://repo.jenkins-ci.org/public/com/github/spotbugs/spotbugs-annotations/4.0.3/spotbugs-annotations-4.0.3.pom
GET https://repo.maven.apache.org/maven2/com/github/spotbugs/spotbugs-annotations/4.0.3/spotbugs-annotations-4.0.3.pom
GET https://repo.jenkins-ci.org/public/org/jvnet/hudson/commons-jexl/1.1-hudson-20071021/commons-jexl-1.1-hudson-20071021.pom
GET https://repo.maven.apache.org/maven2/org/jvnet/hudson/commons-jexl/1.1-hudson-20071021/commons-jexl-1.1-hudson-20071021.pom
GET https://repo.jenkins-ci.org/public/org/springframework/spring-dao/1.2.9/spring-dao-1.2.9.pom
GET https://repo.maven.apache.org/maven2/org/springframework/spring-dao/1.2.9/spring-dao-1.2.9.pom
GET https://repo.jenkins-ci.org/public/org/samba/jcifs/jcifs/1.3.17-kohsuke-1/jcifs-1.3.17-kohsuke-1.pom
GET https://repo.jenkins-ci.org/public/org/jenkins-ci/plugins/plugin/maven-metadata.xml
GET https://repo.maven.apache.org/maven2/org/jenkins-ci/plugins/plugin/maven-metadata.xml
GET https://repo.maven.apache.org/maven2/org/jenkins-ci/plugins/plugin/
GET https://repo.jenkins-ci.org/public/org/jenkins-ci/plugins/plugin/4.40/plugin-4.40.pom
GET https://repo.jenkins-ci.org/public/org/jenkins-ci/main/jenkins-test-harness/1736.vc72c458c5103/jenkins-test-harness-1736.vc72c458c5103.pom
GET https://repo.jenkins-ci.org/public/org/jenkins-ci/main/jenkins-test-harness-htmlunit/86.v3e0c60e7769e/jenkins-test-harness-htmlunit-86.v3e0c60e7769e.pom
GET https://repo.jenkins-ci.org/public/org/eclipse/jetty/websocket/websocket-api/9.4.46.v20220331/websocket-api-9.4.46.v20220331.pom
GET https://repo.maven.apache.org/maven2/org/eclipse/jetty/websocket/websocket-api/9.4.46.v20220331/websocket-api-9.4.46.v20220331.pom
GET https://repo.jenkins-ci.org/public/org/eclipse/jetty/websocket/websocket-parent/9.4.46.v20220331/websocket-parent-9.4.46.v20220331.pom
GET https://repo.maven.apache.org/maven2/org/eclipse/jetty/websocket/websocket-parent/9.4.46.v20220331/websocket-parent-9.4.46.v20220331.pom
GET https://repo.jenkins-ci.org/public/org/eclipse/jetty/websocket/websocket-server/9.4.46.v20220331/websocket-server-9.4.46.v20220331.pom
GET https://repo.maven.apache.org/maven2/org/eclipse/jetty/websocket/websocket-server/9.4.46.v20220331/websocket-server-9.4.46.v20220331.pom
GET https://repo.jenkins-ci.org/public/org/netbeans/modules/org-netbeans-insane/RELEASE130/org-netbeans-insane-RELEASE130.pom
GET https://repo.maven.apache.org/maven2/org/netbeans/modules/org-netbeans-insane/RELEASE130/org-netbeans-insane-RELEASE130.pom
GET https://repo.jenkins-ci.org/public/org/openjdk/jmh/jmh-core/1.35/jmh-core-1.35.pom
GET https://repo.maven.apache.org/maven2/org/openjdk/jmh/jmh-core/1.35/jmh-core-1.35.pom
GET https://download.java.net/maven/2/org/openjdk/jmh/jmh-parent/1.35/jmh-parent-1.35.pom
GET https://repo.jenkins-ci.org/public/org/openjdk/jmh/jmh-parent/1.35/jmh-parent-1.35.pom
GET https://repo.maven.apache.org/maven2/org/openjdk/jmh/jmh-parent/1.35/jmh-parent-1.35.pom
GET https://repo.jenkins-ci.org/public/org/openjdk/jmh/jmh-generator-annprocess/1.35/jmh-generator-annprocess-1.35.pom
GET https://repo.maven.apache.org/maven2/org/openjdk/jmh/jmh-generator-annprocess/1.35/jmh-generator-annprocess-1.35.pom
GET https://repo.jenkins-ci.org/public/org/eclipse/jetty/websocket/websocket-common/9.4.46.v20220331/websocket-common-9.4.46.v20220331.pom
GET https://repo.maven.apache.org/maven2/org/eclipse/jetty/websocket/websocket-common/9.4.46.v20220331/websocket-common-9.4.46.v20220331.pom
GET https://repo.jenkins-ci.org/public/org/eclipse/jetty/websocket/websocket-client/9.4.46.v20220331/websocket-client-9.4.46.v20220331.pom
GET https://repo.maven.apache.org/maven2/org/eclipse/jetty/websocket/websocket-client/9.4.46.v20220331/websocket-client-9.4.46.v20220331.pom
GET https://repo.jenkins-ci.org/public/org/eclipse/jetty/websocket/websocket-servlet/9.4.46.v20220331/websocket-servlet-9.4.46.v20220331.pom
GET https://repo.maven.apache.org/maven2/org/eclipse/jetty/websocket/websocket-servlet/9.4.46.v20220331/websocket-servlet-9.4.46.v20220331.pom
GET https://repo.jenkins-ci.org/public/org/eclipse/jetty/jetty-client/9.4.46.v20220331/jetty-client-9.4.46.v20220331.pom
GET https://repo.maven.apache.org/maven2/org/eclipse/jetty/jetty-client/9.4.46.v20220331/jetty-client-9.4.46.v20220331.pom
GET https://repo.jenkins-ci.org/public/org/codehaus/mojo/animal-sniffer-annotations/1.21/animal-sniffer-annotations-1.21.pom
GET https://repo.maven.apache.org/maven2/org/codehaus/mojo/animal-sniffer-annotations/1.21/animal-sniffer-annotations-1.21.pom
GET https://repo.jenkins-ci.org/public/org/codehaus/mojo/animal-sniffer-parent/1.21/animal-sniffer-parent-1.21.pom
GET https://repo.maven.apache.org/maven2/org/codehaus/mojo/animal-sniffer-parent/1.21/animal-sniffer-parent-1.21.pom
GET https://repo.jenkins-ci.org/public/org/codehaus/mojo/mojo-parent/65/mojo-parent-65.pom
GET https://repo.maven.apache.org/maven2/org/codehaus/mojo/mojo-parent/65/mojo-parent-65.pom
This is just by adding
System.out.println(request.getMethod() + " " + request.getUrl());
to MavenPomDownloader#sendRequest :smirk: When you run the test, you just see the lines print one after the other, there isn’t really one much slower.
FYI, I dived into Maven’s integration tests recently, and they actually run mostly offline. They just have a bootstrap.txt that pre-loads a local repository with the required artifacts (and their dependencies) and then they block the calls in the actual tests. Maybe something to investigate?
That indeed sounds worthwhile. Maybe we could sum up the total time spent downloading POMs (and jars? And Metadata?) during an entire test execution just to get an idea of how much time could be saved here.
Maybe we could configure the tests to use a read-through local file system cache that gets persisted somewhere, so that it can be reused for subsequent runs and in the CI be cached (and then periodically be deleted?).
Did a first pass through (still from crappy airport wifi), but it looks good. I've tried to swap out the pom used in nonMavenCentralRepository() as that had a long tail of resolved dependencies, but that failed as it's not in https://repo.jenkins-ci.org/artifactory/public/org/codehaus/mojo/. I'll double check once home tomorrow.
I do like the option of blocking http:// by default, perhaps through MavenExecutionContextView and then enabled through properties in the Maven and Gradle plugins for folks that still need it.
Thanks once again @DidierLoiseau ! I'll go ahead and merge this iteration already, and we can iterate on some of the other proposals. Great that you noticed and explored this test performance degradation, and appreciate the potential other improvements pointed out like blocking http:// by default.
Following the merge Gradle Develocity's list of slowest test is indeed looking a lot better: https://ge.openrewrite.org/s/lngagjnyfjai6/tests/slowest-tests
| Test | Outcome | Total time |
|---|---|---|
| shouldNotAddToDependencyManagement() org.openrewrite.maven.ChangeParentPomTest :rewrite-maven:test | PASSED | 21.449s |
| skipWorkIfUpdatedEarlier() org.openrewrite.maven.UpdateMavenWrapperTest :rewrite-maven:test | PASSED | 16.951s |
| unresolvableParent() org.openrewrite.maven.MavenDependencyFailuresTest :rewrite-maven:test | PASSED | 15.874s |
| addTransitiveDependencyAsDirect() org.openrewrite.maven.AddDependencyTest :rewrite-maven:test | PASSED | 11.801s |