Mojo 添加 eclipse 源文件夹
Mojo add eclipse source folder
我写了一个生成源代码的maven插件。
这基本上没问题。
问题是,Eclipse 无法将我生成代码的目录识别为附加源文件夹。因此我收到大量错误 XXX cannot be resolved to a type
。不过,maven 从命令行编译和安装工作正常。
首先,我通过在 build-helper-maven-plugin
中使用 org.codehaus.mojo.build-helper-maven-plugin
. This works fine. However, I don't like that the user of my plugin needs to add a second plugin as well. Therefore I had a look into the source code of the add-source
goal 解决了这个问题,并决定将相关代码直接添加到我的插件中。因此我的插件看起来像这样:
@Mojo(name = "generate-sources", defaultPhase = LifecyclePhase.GENERATE_SOURCES)
public class MyMojo extends AbstractMojo {
@Parameter(defaultValue = "${project}", readonly = true, required = true)
private MavenProject project;
@Parameter(required = true)
private File targetDirectory;
// some more members
@Override
public void execute() throws MojoExecutionException {
// generation of the sources into targetDirectory
project.addCompileSourceRoot(targetDirectory.getAbsolutePath());
}
}
在命令行和 eclipse(使用 Alt+F5 或右键单击 -> Maven -> 更新项目)的执行过程中都没有错误。
但是,无法识别其他源目录。
我做错了什么吗?或者我需要一个特殊的 m2e 连接器吗?目前我正在使用
解决这个带有 lifecycle-mapping plugin 的 m2e 连接器
<action>
<execute>
<runOnConfiguration>true</runOnConfiguration>
<runOnIncremental>true</runOnIncremental>
</execute>
</action>
尽管您的插件向项目添加了额外的源目录,但 Eclipse 无法识别。您可以配置 Eclipse 执行您的目标,但不能告诉 Eclipse 添加额外的源目录。
有些插件,例如build-helper
,可以添加额外的源目录,但需要相应的m2e扩展名。没有适用于所有插件的通用 m2e。
您有以下选择:
- 使用
build-helper-maven-plugin
。我同意这是愚蠢的
- 编写自己的 m2e 扩展。比选项 1 差很多。
- 为您的插件生成的源代码使用单独的 maven 模块。在这样的模块中,您可以定义
<sourceDirectory>${project.build.directory}/generate-sources</..>
。这种分离是有道理的:生成的代码通常与常规代码具有不同的性质。
- 什么也不做,要求开发人员手动添加额外的源文件夹。这看起来很原始,但有一个优点 - 手动添加的源文件夹不会在 [右键单击 -> Maven -> 更新项目]
上删除
我写了一个生成源代码的maven插件。 这基本上没问题。
问题是,Eclipse 无法将我生成代码的目录识别为附加源文件夹。因此我收到大量错误 XXX cannot be resolved to a type
。不过,maven 从命令行编译和安装工作正常。
首先,我通过在 build-helper-maven-plugin
中使用 org.codehaus.mojo.build-helper-maven-plugin
. This works fine. However, I don't like that the user of my plugin needs to add a second plugin as well. Therefore I had a look into the source code of the add-source
goal 解决了这个问题,并决定将相关代码直接添加到我的插件中。因此我的插件看起来像这样:
@Mojo(name = "generate-sources", defaultPhase = LifecyclePhase.GENERATE_SOURCES)
public class MyMojo extends AbstractMojo {
@Parameter(defaultValue = "${project}", readonly = true, required = true)
private MavenProject project;
@Parameter(required = true)
private File targetDirectory;
// some more members
@Override
public void execute() throws MojoExecutionException {
// generation of the sources into targetDirectory
project.addCompileSourceRoot(targetDirectory.getAbsolutePath());
}
}
在命令行和 eclipse(使用 Alt+F5 或右键单击 -> Maven -> 更新项目)的执行过程中都没有错误。 但是,无法识别其他源目录。
我做错了什么吗?或者我需要一个特殊的 m2e 连接器吗?目前我正在使用
解决这个带有 lifecycle-mapping plugin 的 m2e 连接器<action>
<execute>
<runOnConfiguration>true</runOnConfiguration>
<runOnIncremental>true</runOnIncremental>
</execute>
</action>
尽管您的插件向项目添加了额外的源目录,但 Eclipse 无法识别。您可以配置 Eclipse 执行您的目标,但不能告诉 Eclipse 添加额外的源目录。
有些插件,例如build-helper
,可以添加额外的源目录,但需要相应的m2e扩展名。没有适用于所有插件的通用 m2e。
您有以下选择:
- 使用
build-helper-maven-plugin
。我同意这是愚蠢的 - 编写自己的 m2e 扩展。比选项 1 差很多。
- 为您的插件生成的源代码使用单独的 maven 模块。在这样的模块中,您可以定义
<sourceDirectory>${project.build.directory}/generate-sources</..>
。这种分离是有道理的:生成的代码通常与常规代码具有不同的性质。 - 什么也不做,要求开发人员手动添加额外的源文件夹。这看起来很原始,但有一个优点 - 手动添加的源文件夹不会在 [右键单击 -> Maven -> 更新项目] 上删除