【问题标题】:maven-source-plugin builds sources.jar, but it's unusable by IDEsmaven-source-plugin 构建sources.jar,但IDE无法使用
【发布时间】:2015-05-23 11:05:28
【问题描述】:

我有一个Maven project,它是从生成的源代码构建的。我用的是maven-source-plugin,配置如下:

<profiles>
    <profile>
        <id>release</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-source-plugin</artifactId>
                    <version>2.4</version>
                    <executions>
                        <execution>
                            <id>attach-sources</id>
                            <goals>
                                <goal>jar-no-fork</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
                ...

我使用mvn clean install -P release 构建。这会生成一个包含所有源文件的${artifactId}-${version}-sources.jar 文件,但显然它的打包不正确,因为 IDE 无法识别源可用。其他一切都可以正常构建和工作,包括 Javadocs。

库的主要入口点是net.mintern.primitive.Primitive。项目构建时,Java 文件在target/generated-sources/net/mintern/primitive/Primitive.java 生成。然而,在sources.jar 中,Primitive.java(以及primitive 目录中的所有其他内容)位于 JAR 的根目录中。 JAR 中没有父目录 (net/mintern/primitive)。

这是正常的,还是这可能是我的问题的原因?我尝试了不同的includes,更改为jar 而不是jar-no-fork,明确添加&lt;attach&gt;true&lt;/attach&gt;,使用build-helper-maven-pluginadd-source,可能还有更多我忘记了——没有任何效果。 Maven Source Plugin configuration 似乎没有提供任何方法来调整 JAR 中的路径。

你能帮我弄清楚这里发生了什么吗?您可以通过添加此依赖项将项目包含在您的 POM 中:

<groupId>net.mintern</groupId>
<artifactId>primitive</artifactId>
<version>1.2</version>

完整的 POM 可以查看on GitHub,如果您愿意尝试构建它,可以使用git clone https://github.com/mintern-java/primitive.gitgit checkout 1.2 查看有问题的项目。

编辑:我设法使用 maven-jar-plugin 和 build-helper-maven-plugin 的不合规组合解决了这个问题; POM 是 1.2.1 版。不过,我仍然对适当的 maven-source-plugin 修复感兴趣。

【问题讨论】:

  • 所以您声称这是 maven-sources-plugin 的错误?所以请提交 jira jira.codehaus.org/browse/MSOURCES 除此之外,我的假设是您的 fmpp-maven-plugin &lt;outputDirectory&gt;target/generated-sources/net/mintern/primitive&lt;/outputDirectory&gt; 配置似乎是问题所在。你应该把它改成&lt;outputDirectory&gt;target/generated-sources/&lt;/outputDirectory&gt;,但你必须在你的freemaker tempale中提供一个包。
  • 你的预感是正确的!当我将net/mintern/primitive 层次结构添加到我的templates 目录时(这样我就可以直接输出到target/generated-sources),sources.jar 出来是正确的。如果你想把你的评论变成答案,我很乐意接受。否则,我会在几个小时后自己添加答案。
  • 非常感谢您抽出宝贵时间查看!我假设插件通过查看某些目录来操作,而不是通过相互连接。当我试图自己解决问题时,这让我走上了错误的道路。

标签: java maven jar generated-code maven-source-plugin


【解决方案1】:

除此之外,我的假设是您对 fmpp-maven-plugin 的配置:

<outputDirectory>target/generated-sources/net/mintern/primitive</outputDirector‌​y>

似乎是问题所在。您应该将其更改为:

<outputDirectory>target/generated-sources/</outputDirectory> 

但你必须在你的 freemaker 模板中提供一个包。此外,您应该检查 freemarker 插件的文档,以查看 outputDirectory 是否默认未配置为上述值。如果是这样,您可以从您的 pom.xml 中完全删除此条目。 (遵循默认值)。约定优于配置。

【讨论】:

  • 更改模板源文件的位置以便我可以使用默认的outputDirectory 确实解决了问题。 Here's the diff.
猜你喜欢
  • 1970-01-01
  • 2011-06-10
  • 2012-09-28
  • 2012-04-09
  • 1970-01-01
  • 2019-04-11
  • 2011-03-24
  • 1970-01-01
  • 2018-06-16
相关资源
最近更新 更多