1

我有一种情况,我们用 JSmooth 包装一个 jar 以获得合适的 exe 文件。

传统上它是由 ant 构建的,作为我们一般 mavenification 的一部分,当前的短期解决方案是使用 maven-antrun-plugin 设置属性并调用 ant。

不幸的是,这种方法在 Unix 上构建时失败了(因为没有可用的 X11 显示),解决方案是使用-Djava.awt.headless=true. 我想在我的 pom.xml 中执行此操作,但无法确定在哪里执行此操作。

<plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.7</version>
    <executions>
        <execution>
            <phase>package</phase>
            <configuration>
                <target>
                    <!-- create one-jar and exefy it -->
                    <property name="maven.project.build.finalName" value="${project.build.finalName}" />
                    <!-- note: fails on headless Linux for now -->
                    <ant />
                </target>
            </configuration>
            <goals>
                <goal>run</goal>
            </goals>
        </execution>
    </executions>
</plugin>

可以直接 fork 一个新的 JVM,但不要依赖于平台细节。

我怎样才能正确地做到这一点?

4

2 回答 2

5

据我所知,不分叉 JVM 的解决方案是使用 MAVEN_OPT

export MAVEN_OPTS="-Djava.awt.headless=true"

由于 -D 是 JVM 选项,因此您必须直接将其指定为 maven。你不能(再一次,据我所知)将它作为内部参数传递(并且没有任何配置选项允许它)

因此,使用 MAVEN_OPT 参数成为正确的方法。

编辑1:

您可以使用 better-maven2-antrun-plugin 在这里浏览一下

http://code.google.com/p/better-maven2-antrun-plugin/wiki/Usage

编辑 2: 可以帮助 maven-antrun developmentpement 为他们提供一种指定这些参数的方法,例如maven-compiler-plugin。如果您真的想使用 pom 信息,这将是最好的方法。

于 2012-06-14T11:20:04.837 回答
2

ant 手册有一个标题为“通过 Java 运行 Ant ”的部分,它展示了如何做你想做的事。下面转载了他们的示例的稍微调整的版本:

<java
        classname="org.apache.tools.ant.launch.Launcher"
        fork="true"
        failonerror="true"
        dir="${basedir}"
        taskname="headless-ant"
>
    <classpath>
        <pathelement location="${ant.home}/lib/ant-launcher.jar"/>
    </classpath>
    <arg value="-buildfile"/>
    <arg file="${ant.file}"/>
    <arg value="-Dbasedir=${basedir}"/>
    <jvmarg value="-Djava.awt.headless=true"/>
</java>

如果您将该片段代替片段中的<ant>元素,它应该可以解决问题。

于 2012-06-17T00:51:44.230 回答