Java 如何让插件执行通过Maven继承项目依赖关系

Java 如何让插件执行通过Maven继承项目依赖关系,java,maven,dependencies,maven-plugin,Java,Maven,Dependencies,Maven Plugin,我使用的是Maven,我希望执行一个插件,而不重复某些必需的依赖项: org.codehaus.mojo SQLMaven插件 1.5 com.h2数据库 氢 1.3.168 com.h2数据库 氢 1.3.168 在上面的示例中,我想省略com.h2数据库:h2依赖项,因为我已经在项目中指定了它。这能做到吗?如何操作?您可以通过在父级中使用pluginManagement块来实现这一点,如下所示: org.codehaus.mojo SQLMaven插件 1.5 com.h2数据库 氢

我使用的是Maven,我希望执行一个插件,而不重复某些必需的依赖项:


org.codehaus.mojo
SQLMaven插件
1.5
com.h2数据库
氢
1.3.168
com.h2数据库
氢
1.3.168

在上面的示例中,我想省略
com.h2数据库:h2
依赖项,因为我已经在项目中指定了它。这能做到吗?如何操作?

您可以通过在父级中使用pluginManagement块来实现这一点,如下所示:


org.codehaus.mojo
SQLMaven插件
1.5
com.h2数据库
氢
1.3.168
在您的孩子身上,您只需要像这样使用执行:


org.codehaus.mojo
SQLMaven插件
....

这将解决仅在一个位置维护补充类路径依赖项(h2)的问题。

您可以通过在父级中使用pluginManagement块来实现这一点,如下所示:


org.codehaus.mojo
SQLMaven插件
1.5
com.h2数据库
氢
1.3.168
在您的孩子身上,您只需要像这样使用执行:


org.codehaus.mojo
SQLMaven插件
....

这将解决仅在一个位置维护补充类路径依赖项(h2)的问题。

而插件不会自动从包含它们的模块/项目继承依赖项(),插件作者仍有可能以模块/项目类路径也可用于插件的方式实现插件。例如,程序或代码生成器就是这样做的

在插件中如何实现这一点的一个示例是:

@Mojo
公共类插件扩展了AbstractMojo{
@参数(property=“project”,required=true,readonly=true)
私人马文项目;
@凌驾
public void execute()引发MojoExecutionException异常{
ClassLoader oldCL=Thread.currentThread().getContextClassLoader();
试一试{
Thread.currentThread().setContextClassLoader(getClassLoader());
//插件逻辑
}
最后{
Thread.currentThread().setContextClassLoader(oldCL);
}
}
@抑制警告(“未选中”)
私有类加载器getClassLoader()引发MojoExecutionException异常{
试一试{
List classpathElements=project.getRuntimeClasspathElements();
URL URL[]=新URL[classpathElements.size()];
for(int i=0;i
虽然插件不会自动从包含它们的模块/项目继承依赖关系(),但插件作者仍然可以以模块/项目类路径也可用于插件的方式实现插件。例如,程序或代码生成器就是这样做的

在插件中如何实现这一点的一个示例是:

@Mojo
公共类插件扩展了AbstractMojo{
@参数(property=“project”,required=true,readonly=true)
私人马文项目;
@凌驾
public void execute()引发MojoExecutionException异常{
ClassLoader oldCL=Thread.currentThread().getContextClassLoader();
试一试{
Thread.currentThread().setContextClassLoader(getClassLoader());
//插件逻辑
}
最后{
Thread.currentThread().setContextClassLoader(oldCL);
}
}
@抑制警告(“未选中”)
私有类加载器getClassLoader()引发MojoExecutionException异常{
试一试{
List classpathElements=project.getRuntimeClasspathElements();
URL URL[]=新URL[classpathElements.size()];
for(int i=0;i
OK,如果我有10个模块都使用同一个插件,那会有帮助。但是我的设置更像是我有一个依赖于H2的模块,然后,有3个插件也使用相同的H2依赖项…你是说其他模块使用的依赖项不是插件吗?如果是,您可以使用DependencyManager。我已经更新了问题。我的意思是,这个插件是从一个已经声明了H2依赖关系的项目中调用的。我想调用插件,而不必重新说明依赖关系(在特定项目中)。这是两件不同的事情。声明一个依赖项并使用一个依赖项作为插件的类路径元素。所以这是不可能的?好吧,如果我有10个模块都使用同一个插件,这会有所帮助。但是我的设置更像是我有一个依赖于H2的模块,然后,有3个插件也使用相同的H2依赖项…你是说其他模块使用的依赖项不是插件吗?如果是,您可以使用DependencyManager。我已经更新了问题。我的意思是,这个插件是从一个已经声明了H2依赖关系的项目中调用的。我想调用这个插件,而不需要重新说明依赖关系(在这个特定的项目中),它们是t