【问题标题】:Maven exec plugin- how to include "system" classpath?Maven exec 插件 - 如何包含“系统”类路径?
【发布时间】:2011-07-14 06:20:31
【问题描述】:

我有一个项目使用“系统”范围来指定包含在我项目的WEB-INF/lib 目录中的 jar 文件。这个工件不在任何 maven 存储库中,所以我必须将它作为我的项目的一部分。我这样做了:

    <dependency>
        <groupId>com.example</groupId>
        <artifactId>MySpecialLib</artifactId>
        <version>1.2</version>
        <scope>system</scope>
        <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/MySpecialLib-1.2.jar</systemPath>
    </dependency>

这对大多数事情都很有效。

但现在我正在尝试在命令行上运行一些代码(在我的 web 应用程序之外,通过我添加的 main() 方法)并且 mvn exec:java 无法解析 MySpecialLib 中的代码,因为它不包含在“运行时”类路径。

我该怎么做:

  • 将 MySpecialLib 添加到运行时类路径

  • 告诉mvn exec:java 也使用system 类路径?

我尝试过mvn exec:java -Dexec.classpathScope=system,但它忽略了runtime 上的所有内容。

【问题讨论】:

    标签: java maven-2 maven


    【解决方案1】:

    使用“编译”范围运行 maven exec 插件 - mvn exec:java -Dexec.classpathScope=compile。这将包括系统范围的依赖项。

    【讨论】:

      【解决方案2】:

      作为 E.G.指出,解决方案是在运行exec时使用compile范围。

      每次调用时:

      mvn exec:java -Dexec.classpathScope=compile
      

      或直接在 exec-plugin-configuration 中:

           <plugin>
              <groupId>org.codehaus.mojo</groupId>
              <artifactId>exec-maven-plugin</artifactId>
              ...
              <configuration>
                    <classpathScope>compile</classpathScope>
              </configuration>
          </plugin>
      

      【讨论】:

        【解决方案3】:

        很高兴知道classpathScope=system 删除了runtime 依赖项。我发现通过将其作为plugin 包含在pom.xml 中可以替代。您能否尝试让我知道它是否也适合您?

        因此,我向 commons-collection 添加了一个系统级依赖项,例如您的工件:-

         <dependency>
                <groupId>commons-collections</groupId>
              <artifactId>commons-collections</artifactId>
              <version>3.0</version>
                <scope>system</scope>
                <systemPath>C:\\<some_path>\\commons-collections-3.0.jar</systemPath>
            </dependency>
        

        然后在&lt;build&gt; 标签中我有exec-maven-plugin 插件在install 阶段执行:-

        <plugin>
           <groupId>org.codehaus.mojo</groupId>
           <artifactId>exec-maven-plugin</artifactId>
           <version>1.1</version>
           <executions>
            <execution>
             <phase>install</phase>
             <goals>
              <goal>java</goal>
             </goals>
             <configuration>
              <mainClass>com.stackoverflow.test.App</mainClass>
             </configuration>
            </execution>
           </executions>
          </plugin>
        

        然后我跑了mvn install。我还确保com.stackoverflow.test.App 类有一些代码可以从commons-collections-3.0 调用一个类。

        希望这会有所帮助。

        【讨论】:

          【解决方案4】:

          正确的答案是使用 maven-install-plugin 并将 Jar 放入您的本地存储库中。或者,更好的是,运行 nexus 或 artifactory 并使用 deploy 插件将 jar 放入其中。系统类路径只是一个受伤的世界。

          【讨论】:

          • 将它添加到本地 repo 的问题在于它是看不见的,而且很容易忘记它是您添加到构建中的自定义内容,并且很容易丢失。还必须指示您团队中的其他开发人员进行相同的手动安装。 Nexus 是一个解决方案的巨大锤子,它应该是一个简单的问题——在你的构建中添加一个定制的工件。然而,我同意你对伤害世界的看法。 :-)
          • 我已经编写了脚本安装到本地 repo 的 makefile 以使其难以忘怀。此外,在我看来,free nexus 是一个提供大量有用功能的小锤子。
          猜你喜欢
          • 2011-05-02
          • 1970-01-01
          • 1970-01-01
          • 2011-01-27
          • 2022-10-23
          • 2016-12-24
          • 2011-02-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多