将自定义 Maven 插件从本地 jar 安装到具有依赖项的本地存储库

Nat*_*han 3 maven maven-install-plugin

我有一个 Maven 插件,我尚未将其上传到中央存储库,但我想在我的项目中使用它。

什么有效

我可以像这样安装 Maven 插件:

git clone https://github.com/RudolfVonKrugstein/jinja-maven-plugin.git
cd jinja-maven-plugin
mvn install
Run Code Online (Sandbox Code Playgroud)

然后我可以使用像这样的 pom.xml 插件:

<?xml version="1.0" encoding="UTF-8"?>
<project>
    <modelVersion>4.0.0</modelVersion>

    <groupId>de.wintercloud</groupId>
    <artifactId>sample</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>de.wintercloud</groupId>
            <artifactId>jinja-maven-plugin</artifactId>
            <version>1.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>de.wintercloud</groupId>
                <artifactId>jinja-maven-plugin</artifactId>
                <version>1.0</version>
                <executions>
                    <execution>
                        <phase>compile</phase>
                        <goals>
                            <goal>renderjinja</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <outputFile>out.txt</outputFile>
                    <templateFile>templ.jinja</templateFile>
                    <varFile>vars.yaml</varFile>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
Run Code Online (Sandbox Code Playgroud)

以下是与编译相关的其他文件:

寺庙神社:

{{ Name }}
Run Code Online (Sandbox Code Playgroud)

vars.yaml:

Name: MyWonderfullName
Run Code Online (Sandbox Code Playgroud)

这有效:

> mvn compile
> cat out.txt 
Run Code Online (Sandbox Code Playgroud)

我的名字

好的!

什么不起作用

现在我正在尝试将该插件作为 jar 提供给我的同事,以便他们可以简单地安装该 jar。想法是这样做:

git clone https://github.com/RudolfVonKrugstein/jinja-maven-plugin.git
cd jinja-maven-plugin
mvn package
mvn org.apache.maven.plugins:maven-install-plugin:2.5.2:install-file -Dfile=target/jinja-maven-plugin-1.0.jar
Run Code Online (Sandbox Code Playgroud)

当我现在这样做时(在示例项目目录中)

mvn compile
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

[ERROR] Failed to execute goal de.wintercloud:jinja-maven-plugin:1.0:renderjinja (default) on project sample: Execution default of goal de.wintercloud:jinja-maven-plugin:1.0:renderjinja failed: A required class was missing while executing de.wintercloud:jinja-maven-plugin:1.0:renderjinja: org/yaml/snakeyaml/Yaml
Run Code Online (Sandbox Code Playgroud)

如何安装该 jar 以便将其用作插件?在我看来,好像缺少依赖项。为什么?

Tun*_*aki 5

您只需点击MINSTALL-110,该问题将在 Maven 安装插件的下一个 3.0.0 版本中修复。这里的核心问题是,你手动安装带有file参数的JAR文件,插件检测到里面有POM,但只保留坐标信息(组id,工件id,包装和版本),而不是整个POM 。因此,当安装 POM 时,不会保留依赖项。

事实上,如果你看一下安装的 POM,你会看到

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>de.wintercloud</groupId>
  <artifactId>jinja-maven-plugin</artifactId>
  <version>1.0</version>
  <packaging>maven-plugin</packaging>
  <description>POM was created from install:install-file</description>
</project>
Run Code Online (Sandbox Code Playgroud)

这表明依赖关系没有保留。如果你在运行命令时以调试模式查看 Maven 日志install-file,它将显示

[DEBUG] 使用 META-INF/maven/de.wintercloud/jinja-maven-plugin/pom.xml 作为 groupId、artifactId、packages 和 version

等待版本 3.0.0 的解决方法是通过指定参数来指定要安装的 POM 文件以及主要工件的路径pomFile。改为运行以下命令:

mvn org.apache.maven.plugins:maven-install-plugin:2.5.2:install-file -Dfile=target/jinja-maven-plugin-1.0.jar -DpomFile=pom.xml
Run Code Online (Sandbox Code Playgroud)

然后将安装完整的 POM,而不是通用存根。

通过此更改,错误

[错误] 无法在项目示例上执行目标 de.wintercloud:jinja-maven-plugin:1.0:renderjinja (默认): 目标 de.wintercloud:jinja-maven-plugin:1.0:renderjinja 的执行默认失败: 所需的类是执行 de.wintercloud:jinja-maven-plugin:1.0:renderjinja: org/yaml/snakeyaml/Yaml 时丢失

不会再发生了。Maven 将正确下载依赖项并将其用于插件。