我使用 Maven 的build-helper-maven-plugin
目标reserve-network-port
是稍后在我的 Maven 构建中分配端口以启动 Cargo 容器,以运行一些集成测试
问题是,即使该端口似乎已被插件打开并保留,Cargo 容器也无法启动,告诉我分配的端口已在使用中。这个错误是随机发生的,所以很难重现
当我在本地运行 Maven 构建时它可以工作,但是当我在 Jenkins 的服务器上运行它时通常会失败
这是我的reserve-network-port
配置:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>${build-helper-maven-plugin.version}</version>
<executions>
<execution>
<id>reserve-cargo-network-ports</id>
<phase>pre-integration-test</phase>
<goals>
<goal>reserve-network-port</goal>
</goals>
<configuration>
<minPortNumber>42000</minPortNumber>
<maxPortNumber>42999</maxPortNumber>
<randomPort>true</randomPort>
<portNames>
<portName>cargo.debug.port</portName>
<portName>cargo.rmi.port</portName>
<portName>cargo.servlet.port</portName>
<portName>cargo.tomcat.ajp.port</portName>
</portNames>
</configuration>
</execution>
</executions>
</plugin>
这是我的货物容器的配置部分
<configuration>
<configuration>
<home>${cargo.configuration.home}</home>
<properties>
<cargo.logging>medium</cargo.logging>
<cargo.rmi.port>${cargo.rmi.port}</cargo.rmi.port>
<cargo.servlet.port>${cargo.servlet.port}</cargo.servlet.port>
<!-- The following JVM arguments are only applied to non-embedded containers -->
<cargo.start.jvmargs>${cargo.debug}
${jvmOptions}
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.port=${failsafe.sa.management.port}
-Dcom.sun.management.jmxremote.ssl=false</cargo.start.jvmargs>
<cargo.tomcat.ajp.port>${cargo.tomcat.ajp.port}</cargo.tomcat.ajp.port>
</properties>
<type>standalone</type>
</configuration>
</configuration>
最后是我在启动容器时遇到的错误:
09-Dec-2021 01:36:15.570 SEVERE [main] org.apache.catalina.core.StandardServer.await Failed to create server shutdown socket on address [localhost] and port [42130] (base port [42130] and offset [0])
java.net.BindException: Address already in use (Bind failed)
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:387)
at java.net.ServerSocket.bind(ServerSocket.java:390)
at java.net.ServerSocket.<init>(ServerSocket.java:252)
at org.apache.catalina.core.StandardServer.await(StandardServer.java:584)
at org.apache.catalina.startup.Catalina.await(Catalina.java:864)
at org.apache.catalina.startup.Catalina.start(Catalina.java:810)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:342)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:473)
有谁知道为什么港口的预订失败?
还有其他替代方法可以使用它build-helper-maven-plugin
来保留端口吗?