如何在 Maven mojo 中捆绑现有的 java 可执行文件
我有一个现有的java命令行程序,它需要大量的参数并使用优秀的 args4j 解析它们。
我现在想要制作一个 Maven 插件 mojo,它将运行此应用程序中包含的 Java 代码。
到目前为止,我已经尝试了基本方法:将每个命令行参数复制到 mojo 参数中。但是我发现这非常无聊且容易出错,因为 Maven mojo javadoc 注释远不如 args4j 注释完整和集成。
那么,使用 Maven 3,是否有更好的方法让我的可执行文件作为 Maven Mojo 运行? 哦,请不要跟我谈论 exec-maven-plugin,我发现在这种情况下它太有限了(我的可执行文件必须使用项目设置和用户配置文件的混合来运行,我想简单地调用 maven-exec-plugin 不会成功)。
I have an existing java command-line program, that takes a bazillion of arguments and parses them using excellent args4j.
I now want to make a maven plugin mojo that will run the Java code contained in this application.
As of now, I've tried the basic way : replicating each and any command line argument into a mojo parameter. Bu I find this exceptionnally boring and error-prone, as maven mojo javadoc annotations are far less complete and integrated than can be args4j annotations.
So, using maven 3, is there a better way to have my executable run as a maven mojo ?
Oh, please don't talk me about exec-maven-plugin, as I find it far too limited in that case (my executable will have to be run using a mix of project settings and user profile ones, and I guess simply calling maven-exec-plugin won't do the trick).
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
唯一的方法是通过 mojo 参数,因为这是 Maven 方法,特别是对于 Maven 插件。
我错过了定义一个属性文件,其中包含配置作为 mojo 参数的替代方案。但我认为对于 Maven 插件来说,最佳实践是使用 Mojo 参数。
The only way is via the mojo parameters cause that's the Maven way in particular for Maven Plugins.
What i missed to define a property file which contains the configuration as an alternative to the mojo parameters. But i think for Maven Plugins the best practice is to have Mojo Parameters.
虽然@khmarbaise的回答 从一般观点来看是完全正确的,我想稍微扩展一下。
我的独立命令行应用程序使用 args4j,但我认为使用 Commons CLI 或(甚至更多)JCommander 依赖于主 bean 中的相同命令行注释。
所以,我所做的是一个 Maven 魔力,它使用内省来获取主 bean 命令行参数的列表。
对于每个参数,我希望项目/设置信息中存在一个属性。如果存在此属性,我将使用该选项和关联的最后构建一个假命令行。
浏览完所有选项(存储为 Maven 属性)后,我可以使用 args4j 填充我的 bean,然后使用其主命令运行该 bean。
我认为这种方法可以很好地推广,只要您的应用程序有一组标志和一个无参数
run()
方法。Although @khmarbaise's answer is perfectly true on a general point of view, I would like to extend it a little.
My standalone command-line application uses args4j, but I think the process can be fairly well copied using Commons CLI or (even more) JCommander which relies on the same command line annotations in a main bean.
So, what I've done is a maven mojo that, using introspection, get the list of main bean command line arguments.
For each of these arguments, I expect a property to be present in the project/settings infos. If this property is present, I build a fake command line using the option and the associated finally.
Once I have browsed all options (stored as maven properties), I can use args4j to fill my bean, then run this bean using its main command.
i think this approach could be quite well generalized, provided your application has a set of flags and a no-args
run()
method.