我有一个项目,其中使用Java后端(X),需要启动另一个Maven项目(Y)(类似mvn test
)。使用ProcessBuilder可以正常工作。
我最近还添加了JMX配置来监视Y-JVM,因为可以运行多个Y项目。 JMX配置作为环境变量MAVEN_OPS
传递,我有一种方法来生成范围内的唯一随机端口。我还可以从X后端通过随机生成的端口连接到JMX,但是问题是,这仅在项目处于构建状态时才有效。在构建完成之后,行家应该“启动”服务,我得到了这个错误:
[INFO] --- gatling-maven-plugin:2.2.4:execute(test1)@ xxxxxxx-由于CompileSetup不兼容,因此修剪了先前的分析源。
[INFO] -------------------------------------------- ----------------------------
[INFO]内置故障
[INFO] -------------------------------------------- ----------------------------
[INFO]总时间:15.388 s
[INFO]完成于:2018-12-27T09:31:10 + 01:00
[INFO]最终内存:15M / 363M
[INFO] -------------------------------------------- ----------------------------
[错误]无法在项目xxxxxxx上执行目标io.gatling:gatling-maven-plugin:2.2.4:execute(test1):Xxxxxx失败。进程退出并出现错误:1(退出值:1)-> [帮助1] [错误]
[ERROR]要查看错误的完整堆栈跟踪,请使用-e开关重新运行Maven。
[错误]使用-X开关重新运行Maven以启用完整的调试日志记录。
[错误]
[ERROR]有关错误和可能的解决方案的更多信息,请阅读以下文章:
[错误] [帮助1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException 错误:代理抛出异常:java.rmi.server.ExportException:端口已在使用中:xxxx;嵌套的 例外是:java.net.BindException:地址已在使用中(绑定失败)
在此之前,我能够使用JMX获得指标。所以现在,我的问题是,maven在构建和执行状态下使用不同的JVM吗?为什么我的端口已被使用??
答案 0 :(得分:1)
每个Java程序都将在其自己的 JVM 中执行,因此回答您的问题是,Maven将在其自己的JVM中执行。
在后端详细说明,是春季启动还是其他应用程序。您可能需要为每个后端明确定义端口。您在Gatling上下文中需要任何帮助吗,正如我在代码段中看到的Gatling日志一样。
答案 1 :(得分:0)
在项目Y上创建唯一范围的端口,并不能保证与项目X所使用的端口不会发生冲突。除了预先创建一系列端口之外,您还可以在需要时动态创建它们连接到他们。只需确保捕获任何异常,然后使用其他端口重试即可。例如。尝试连接到8080,如果连接失败,则尝试8081,然后尝试8082,直到建立连接。