在M2存储库中调用jar文件

时间:2012-03-23 03:11:05

标签: maven

我有一个项目,我希望在当前项目的后期执行阶段调用M2 repo中的另一个Jar文件。

我的POM的示例骨架

<plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>exec-maven-plugin</artifactId>
          <version>1.1</version>

            <executions>
              <execution>
              <id>exec-one</id>
              <phase>verify</phase>
              <configuration>
                  executable>java</executable>
                  <arguments> <argument>-jar</argument>
                  <argument>JarToInvoke.jar</argument>
                  </arguments>                
                  <**workingDirectory**>/C:/path to repo</workingDirectory>
                  </configuration>
                      <goals>
                         <goal>exec</goal>
                      </goals>
                  </execution>
                  </executions>

              <dependencies> <dependency>
                 <groupId>GroupId of JarToInvoke</groupId>
                 <artifactId>JarToInvoke</artifactId>
               <version>1.0.0-SNAPSHOT</version>
              </dependency>
              </dependencies>
            </plugin>    
          </plugins>

我尝试使用maven-exec-plugin,但遇到以下问题;

  1. 我需要指定JarToInvoke依赖项吗?作为项目依赖项还是作为exec-plugin依赖项?

  2. 通过对工作目录(/ C:/ repo)进行硬编码,我可以调用JarToInvoke工件。但这不是一个好的解决方案,因为最终这个项目应该在任何具有不同操作系统的m / c中运行。那么如何让exec-plugin在项目的M2 repo中搜索JarToInvoke工件(默认类路径)?

  3. 3.在工作目录中对M2 repo路径进行硬编码时,我能够调用JarToInvoke工件。但是在运行JarToInvoke工件时,它会抛出另一个依赖项问题,但找不到JarToInvoke的一些log4j依赖项。我将JarToInvoke设为阴影jar,它按预期工作。但它不是永久性或良好的解决方案(因为阴影罐的大小为35 MB)。如何指示exec-plugin在M2 repo中查找依赖的Jars。

    请分享您的建议。在此先感谢。

2 个答案:

答案 0 :(得分:1)

Exec插件文档中的这个example page描述了我想要的内容。

如果您可以使用exec:java目标而不是exec:exec,则会为您找到JVM。您还可以通过更改插件的includeProjectDependenciesincludePluginDependencies配置选项来引入插件依赖项或项目依赖项。

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.1</version>

    <executions>
        <execution>
            <id>exec-one</id>
            <phase>verify</phase>
            <configuration>
                <includeProjectDependencies>false</includeProjectDependencies>
                <includePluginDependencies>true</includePluginDependencies>
                <executableDependency>
                    <groupId>GroupId of JarToInvoke</groupId>
                    <artifactId>JarToInvoke</artifactId>
                </executableDependency>

                <!-- Look up the main class from the manifest inside your dependency's JAR -->
                <mainClass>com.example.Main</mainClass>
                <arguments>
                    <!-- Add any arguments after your JAR here --->
                </arguments>
            </configuration>
            <goals>
              <goal>java</goal>
           </goals>
        </execution>
    </executions>

    <dependencies>
        <dependency>
            <groupId>GroupId of JarToInvoke</groupId>
            <artifactId>JarToInvoke</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
</plugin>    

唯一的缺点是你必须在JAR中显式指定要运行的主类。您可以通过打开依赖项JAR中的清单并读取Main-Class属性来查找它。

如果确实需要使用exec:exec,您可以使用Maven Dependency Plugin的copy-dependencies目标将依赖项从本地存储库复制到预定义位置(例如{ {1}} / exec-jars)然后你可以在exec插件的${project.build.directory}配置选项中提供这个目录。

答案 1 :(得分:1)

找到jar文件的绝对路径可能更简单的方法是使用properties <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>2.3</version> <executions> <execution> <goals> <goal>properties</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.1</version> <executions> <execution> <id>exec-one</id> <phase>verify</phase> <configuration> <executable>java</executable> <arguments> <argument>-jar</argument> <argument>${GroupIdofJarToInvoke:JarToInvoke:jar}</argument> </arguments> <workingDirectory>/C:/path to repo</workingDirectory> </configuration> <goals> <goal>exec</goal> </goals> </execution> </executions> </plugin> </plugins> <dependencies> <dependency> <groupId>GroupIdofJarToInvoke</groupId> <artifactId>JarToInvoke</artifactId> <version>1.0.0-SNAPSHOT</version> </dependency> <dependencies> 目标。

self.response.write(json.encode(self.getVertices()))