Java -XstartOnFirstThread 命令行选项在 Linux 中无法识别但在 OSX 中有效

Java -XstartOnFirstThread command line options unrecognized in Linux but working in OSX

我在单元测试中使用 -XstartOnFirstThread 参数来解决 OS X 中的 SWT 启动问题:

    <build>
    <plugins>
        <plugin>
            <groupId>org.eclipse.tycho</groupId>
            <artifactId>tycho-surefire-plugin</artifactId>
            <version>1.0.0</version>
            <configuration>
                <argLine>-XstartOnFirstThread</argLine>
            </configuration>
        </plugin>
    </plugins>
</build>

测试在 OSX 中通过,但在 Linux 中失败,并提到 -XstartOnFirstThread 无法识别:

[/var/local/devtools/jdk1.8.0_141/jre/bin/java, -Dosgi.noShutdown=false, 
-Dosgi.os=linux, -Dosgi.ws=gtk, -Dosgi.arch=x86_64, -XstartOnFirstThread,
-Dosgi.clean=true, -jar ...

21:22:35 [artifact:mvn] Unrecognized option: -XstartOnFirstThread
21:22:35 [artifact:mvn] Error: Could not create the Java Virtual Machine.
21:22:35 [artifact:mvn] Error: A fatal exception has occurred. Program will exit.

有什么方法可以让这个在 Linux 上工作,或者有什么方法可以在 tycho 中添加一个条件来忽略 Linux 中的这个参数。

你这边理解有误。当你 运行 java -X 时,你会被告知:

The -X options are non-standard and subject to change without notice.

换句话说:任何以 -X 开头的东西都是 高度 实现特定的。当然,这也增加了版本控制的时刻。

含义:除非您在 Linux 和 Mac 上使用完全相同版本的 Oracle Java,否则任何以 -X 开头的东西可能 工作方式不同。

换句话说:很可能您的期望认为这在两个平台上都有效,但从一开始就是有缺陷的。

因为 -XstartOnFirstThread 选项是 Mac OS X 特定的,使用仅当 JUnit 测试在 macOS 中是 运行 时才会触发的配置文件,听起来最好选项。

<profiles>
    <profile>
        <id>platform-mac</id>
        <activation>
            <os>
                <family>mac</family>
            </os>
        </activation>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.eclipse.tycho</groupId>
                    <artifactId>tycho-surefire-plugin</artifactId>
                    <version>1.0.0</version>
                    <configuration>
                        <argLine>-XstartOnFirstThread</argLine>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>