【问题标题】:Maven: How to specify Javac plugin argument with maven-compiler-plugin?Maven:如何使用 maven-compiler-plugin 指定 Javac 插件参数?
【发布时间】:2018-02-09 23:25:55
【问题描述】:

Javac 提供以下非标准选项(来自“javac -X”命令​​行帮助):

-Xplugin:"name args"       Name and optional arguments for a plug-in to be run

但是,Maven 不处理这种格式。例如,以下内容不起作用:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <compilerArgs>
      <arg>-Xplugin:"Manifold static"</arg>
    </compilerArgs>
  </configuration>
</plugin>

我尝试了几种不同的变体,并尝试将空格替换为“=”,但仍然不行。有解决办法吗?

注意我在 Java 8 中使用Manifold javac 插件。复制很简单.. 创建一个依赖于多方面 jar 的 pom:

<dependency>
  <groupId>systems.manifold</groupId>
  <artifactId>manifold-all</artifactId>
  <version>0.9-alpha</version>
</dependency>

您实际上并不需要任何来源,这只是为了证明 Maven 不会接受 -Xplugin:"Manifold static" javac 参数。

另请注意,Java 9 似乎已将 -Xplugin 的格式更改为不再需要引号。请参阅Java 9 docs

【问题讨论】:

  • 你有没有试图逃离这个空间?
  • @Andrey 哈哈,是的,这是我的项目,它现在处于 alpha 阶段。我不确定该测试依赖项在哪里或如何发挥作用。你能提供你的 pom 文件以便我重现吗?
  • 您应该能够使用带有默认 -Xplugin:Manifold javac 参数的插件和基本 jar 文件依赖项:&lt;dependency&gt; &lt;groupId&gt;systems.manifold&lt;/groupId&gt; &lt;artifactId&gt;manifold&lt;/artifactId&gt; &lt;version&gt;0.9-alpha&lt;/version&gt; &lt;/dependency&gt;
  • 另外,您实际上并不需要在项目中“使用”该插件,只需尝试使用 Maven 编译它并查看有关 -Xplugin:"Manifold static" 参数的错误。

标签: java maven javac javac-compiler-plugin


【解决方案1】:

鉴于此讨论:MCOMPILER-178 和此补丁:pull request,并且由于空格似乎不是 XML 名称中允许的字符,我怀疑您必须删除所有双精度-引号,并保留所有空格。

这里是:

myOption=foo"bar"baz

bash(或您使用的任何外壳)中的字符串连接。它将字符串“foobarbaz”存储在变量myOption 中。如果您在bash 的选项中使用双引号,那么它仅表示:“bash,请将引号之间的整个内容视为单个参数,不要将其拆分为字符串参数数组”。例如,如果您运行以下命令 bash 脚本:

#!/bin/bash

echo $1
echo $2
echo $3

使用这些参数:

$ ./testArgs.sh hello -World:"blah blah blah" foobar

你会得到这个输出:

hello
-World:blah blah blah
foobar

-World:blah blah blah 部分是单个字符串,不保留引号。

Maven 不是 bash。 POM 是一个 XML 文件,它有标签,有些标签是用文本填充的。 XML 不关心 bash 用于字符串连接或参数解析的语法。如果我正确理解了上面的讨论,他们将 xml-tags 的内容直接传递给编译器,没有任何修改。

因此,我最好的猜测是去掉双引号:

<arg>-Xplugin:MyPlugin myArg</arg>

如果这没有帮助,那么我完全误解了上面链接的讨论,或者您使用的 maven 版本可能工作方式不同。

【讨论】:

  • 感谢您的建议,谢谢,但是我已经尝试过这个和许多其他变体,但没有运气。您提到的讨论涉及&lt;compilerArguments&gt;,它与&lt;compilerArgs&gt; 不同,但仍然以类似的方式失败。
  • @ScottMcKinney 讨论是关于&lt;compilerArguments&gt;(结果很尴尬),这就是引入&lt;compilerArgs&gt; 的原因。如果我的建议不起作用,那么我不得不同意这似乎很违反直觉。有没有办法让您的问题可重现,即指定 maven 版本、特定的编译器插件以及 &lt;arg&gt; 的确切内容?如果它是您自己的插件,也许它可以以某种方式简化为一个微不足道的无操作编译器插件?这很奇怪,因为所有文本(包括空格)都应该原封不动地传递给javac...
  • 是的,这很奇怪。我正在使用Manifold 插件。复制很简单.. 创建一个依赖于多方面 jar 的 pom(如果使用 Java 8,则为 tools.jar)。然后添加上面的 maven-compiler-plugin 示例。我目前正在使用 Maven 3.5.0。标准的 Manifold 插件设置解决了这个问题:-Xplugin:Manifold,但如果可能的话,我想要一种使用 static 参数的方法。
  • @ScottMcKinney 我今天无法尝试,在这个地区已经很晚了......您能否将此信息添加到您的原始问题中(有一点灰色'下的“编辑”按钮)。 Manifold 的链接特别有用,因为这使得问题可以重现,这很好!我正在考虑我可以为此额外创建javac-compiler-plugin 标记,否则这个问题在所有“maven-compiler-plugin”-hits 中都存在。但是,明天... ;)
  • @ScottMcKinney 如果您能更准确地描述“no bueno”的含义,这也将非常有帮助:mvn 是否抱怨,或者javac 是否抱怨,或者插件本身是否抱怨?还是编译器插件只是忽略参数? (我明天会发现,但它可能对那些会遇到类似问题的人有所帮助)。
猜你喜欢
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-04
  • 1970-01-01
  • 2014-02-23
  • 2022-09-28
  • 1970-01-01
相关资源
最近更新 更多