运行 @QuarkusTest 当 Maven 仓库需要 SSL 认证

Running @QuarkusTest when maven repo requires SSL auth

我正在做 Quarkus.io 的演示,我在连接到公司 Maven 存储库时遇到问题,因为它使用相互 TLS 进行身份验证。

即当我从 quarkus-quickstarts 运行 test-目标 getting-started-testing 时,我遇到了以下错误:

[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running org.acme.quickstart.GreetingResourceTest
[ERROR] Tests run: 2, Failures: 0, Errors: 2, Skipped: 0, Time elapsed: 3.139 s <<< FAILURE! - in org.acme.quickstart.GreetingResourceTest
[ERROR] testHelloEndpoint  Time elapsed: 0.012 s  <<< ERROR!
org.junit.jupiter.api.extension.TestInstantiationException: TestInstanceFactory [io.quarkus.test.junit.QuarkusTestExtension] failed to instantiate test class [org.acme.quickstart.GreetingResourceTest]: io.quarkus.bootstrap.resolver.AppModelResolverException: Failed to collect dependencies for io.quarkus:quarkus-resteasy-deployment:jar:1.2.0.Final
Caused by: io.quarkus.bootstrap.resolver.maven.DeploymentInjectionException: io.quarkus.bootstrap.resolver.AppModelResolverException: Failed to collect dependencies for io.quarkus:quarkus-resteasy-deployment:jar:1.2.0.Final
Caused by: io.quarkus.bootstrap.resolver.AppModelResolverException: Failed to collect dependencies for io.quarkus:quarkus-resteasy-deployment:jar:1.2.0.Final
Caused by: org.eclipse.aether.collection.DependencyCollectionException: Failed to collect dependencies at io.quarkus:quarkus-resteasy-server-common-deployment:jar:1.2.0.Final -> io.quarkus:quarkus-core-deployment:jar:1.2.0.Final -> io.quarkus:quarkus-bootstrap-core:jar:1.2.0.Final -> org.apache.maven.resolver:maven-resolver-transport-wagon:jar:1.1.1 -> org.apache.maven.wagon:wagon-provider-api:jar:3.3.3
Caused by: org.eclipse.aether.resolution.ArtifactDescriptorException: Failed to read artifact descriptor for org.apache.maven.wagon:wagon-provider-api:jar:3.3.3
Caused by: org.eclipse.aether.resolution.ArtifactResolutionException: Could not transfer artifact org.apache.maven.wagon:wagon-provider-api:pom:3.3.3 from/to corporate-public (https://maven.corporate.net/content/repositories/corporate-public): Received fatal alert: handshake_failure
Caused by: org.eclipse.aether.transfer.ArtifactTransferException: Could not transfer artifact org.apache.maven.wagon:wagon-provider-api:pom:3.3.3 from/to corporate-public (https://maven.corporate.net/content/repositories/corporate-public): Received fatal alert: handshake_failure
Caused by: org.apache.maven.wagon.TransferFailedException: Received fatal alert: handshake_failure
Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

-Djavax.net.ssl.keyStore* 属性通常由 Maven 从 ~/.mavenrcMAVEN_OPTS 环境属性中获取,但是如何为 运行 Quarkus 测试指定它们?

这应该是显而易见的,但无论如何我都会声明 - 切换到使用 public 存储库不是一个可接受的解决方案。

如果其他人遇到此问题,解决方法是将 javax.net.ssl.* 系统属性传播到 Maven Surefire 插件,例如将这些行添加到 Surefire 配置中:

<javax.net.ssl.keyStoreType>${javax.net.ssl.keyStoreType}</javax.net.ssl.keyStoreType>
<javax.net.ssl.keyStore>${javax.net.ssl.keyStore}</javax.net.ssl.keyStore>
<javax.net.ssl.keyStorePassword>${javax.net.ssl.keyStorePassword}</javax.net.ssl.keyStorePassword>

(这个答案完全是在控制@tveon 在 Quarkus 的 GitHub 回购中的 Quarkus tests fails mTLS authentication against internal Maven repository 问题中的信息)。