Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Actually use TLS in (some) Maven tests and shove a few minutes from their execution #4591

Merged
merged 3 commits into from
Oct 21, 2024

Conversation

DidierLoiseau
Copy link
Contributor

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! 😏

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 d2c825c, 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 😅) 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

  • I've added unit tests to cover both positive and negative cases
  • I've read and applied the recipe conventions and best practices
  • I've used the IntelliJ IDEA auto-formatter on affected files

Copy link
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some suggestions could not be made:

  • rewrite-maven/src/test/java/org/openrewrite/maven/internal/MavenPomDownloaderTest.java
    • lines 24-24

@DidierLoiseau DidierLoiseau force-pushed the feat/tls-support-in-tests branch from d84fb1e to 6a2eb13 Compare October 18, 2024 23:05
@timtebeek
Copy link
Contributor

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.

@timtebeek timtebeek added the enhancement New feature or request label Oct 19, 2024
@pstreef
Copy link
Contributor

pstreef commented Oct 19, 2024

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!

@DidierLoiseau
Copy link
Contributor Author

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 🙂

@DidierLoiseau
Copy link
Contributor Author

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)

@DidierLoiseau
Copy link
Contributor Author

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 😏 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?

@knutwannheden
Copy link
Contributor

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?).

Reduces what needs to be resolved to speed up test.
@timtebeek
Copy link
Contributor

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.

@timtebeek
Copy link
Contributor

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.

@timtebeek timtebeek merged commit ae1a920 into openrewrite:main Oct 21, 2024
2 checks passed
@timtebeek
Copy link
Contributor

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
Archived in project
Development

Successfully merging this pull request may close these issues.

4 participants