以编程方式启动M2E Maven命令

时间:2013-02-09 23:54:33

标签: java eclipse maven plugins m2e

我正在开发一个Eclipse插件。这个Eclipse插件包含一个New Project向导,在我的向导的performFinish方法中,我想使用Maven(M2E)来执行archetype:generate命令。

然后我发现this resource并且我能够让maven调用者以编程方式生成原型,但是它要求我定义一个maven.home以便它知道mvn可执行文件的位置。

如果实现这一目标的最佳方法是使用maven调用者,我怎样才能获得嵌入式m2e mvn(m2e的maven.home)的路径?

1 个答案:

答案 0 :(得分:1)

嗯 - 我只知道:你可能要搜索它。在设置/安装过程中,通常设置一个环境变量M2_HOME,M3_HOME或MAVEN_HOME。但我不太确定,如果总是这样的话。如果你可以直接从命令提示符启动maven,它可能在PATH环境中。所以 - 搜索Maven的环境:

String mavenHomePath = System.getProperty("maven.home");

if (mavenHomePath == null) {
    Map<String,String> filteredMap = new HashMap<>();
    final List<String> searchEnv = Arrays.asList(new String[]{"m3_home", "m3home", "m2_home", "m2home", "maven_home", "mavenhome", "path"}); 
    for (final Map.Entry<String, String> entry : System.getenv().entrySet()) {
        final String key = entry.getKey().toLowerCase();
        if (searchEnv.contains(key)){
            filteredMap.put(key, entry.getValue());
        }
    }
    for (String key : searchEnv) {
        for (final String pathEnv : filteredMap.values()) {
            for (final String path : pathEnv.split(File.pathSeparator)) {
                mavenHomePath = checkForMavenHomeIn(new File(path));
                if (mavenHomePath != null) break;
            }
            if (mavenHomePath != null) break;
        }
        if (mavenHomePath != null) break;
    }
}

System.setProperty("maven.home", mavenHomePath);

invokeYourPlugIn();

不幸的是,“PATH”并不总是命名为“PATH”,但可能是“路径”甚至是“路径” - 至少在Windows系统上如此。它也可能是m2_home等。所以 - 我过滤了忽略大小写的环境变量。 (我实际上并没有寻找maven,但svn - 但我有类似的问题)。所以 - 我经常阅读“set m2home”或“set m2_home”等。 - 我不确定是否有约定。

checkForMavenHomeIn应该查找bin的父目录。 “path”将指向“bin”,其他指向maven主目录。

否则,您可能必须提示用户输入目录并将其保存到某些eclipse工作区首选项中 - 但执行一些预搜索会很好。