0

所以我终于切换到 Java 15,发现我的旧代码不再编译了。我使用包sun.jvmstat.monitor和类中的类LocalVmManager来检索系统中运行的所有 JVM 的 pid:这适用于 Java8,但不适用于 Java15(我认为它自 Java9 以来就不起作用)。

感谢 IntelliJ,我发现我需要将以下选项传递给javac--add-exports jdk.internal.jvmstat/sun.jvmstat.perfdata.monitor.protocol.local=ALL-UNNAMED --add-exports jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED --add-exports jdk.internal.jvmstat/sun.jvmstat.monitor.event=ALL-UNNAMED

事实上,有了这个选项,我可以通过命令行进行编译。但我也想通过mvn compile. 如何在 pom.xml 中指定编译器选项?

我尝试了以下没有运气:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
            <configuration>
                <release>15</release>
                <compilerArgs>
                    <arg>--add-exports</arg>
                    <arg>jdk.internal.jvmstat/sun.jvmstat.perfdata.monitor.protocol.local=ALL-UNNAMED</arg>
                    <arg>--add-exports</arg>
                    <arg>jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED</arg>
                    <arg>--add-exports</arg>
                    <arg>jdk.internal.jvmstat/sun.jvmstat.monitor.event=ALL-UNNAMED</arg>
                </compilerArgs>
                <fork>true</fork>
            </configuration>
        </plugin>

同时,我将更改我的代码并通过扫描/proc/目录来读取正在运行的 JVM 的 pid。

4

1 回答 1

2

我有好消息要告诉你,你不再需要LocalVmManager了。这将适用于您当前的 JVM:

ProcessHandle.current().pid()

要访问其他进程的 PID:

ProcessHandle
    // returns Stream<ProcessHandle>
    .allProcesses()
    .filter(/* filter to only find JVM processes */)
    .map(ProcessHandle::pid)
    .collect(toList());

ProcessHandleAPI是在 Java 9 中添加的,它为您提供了许多有关操作系统进程的信息 - 也请检查方法info()。:)

于 2021-01-19T19:33:23.627 回答