Maven exec插件ClassNotFoundException

时间:2013-12-20 14:33:50

标签: java maven

我正在使用Maven exec插件从命令行运行java应用程序,命令为mvn exec:java。我已经在pom.xml中指定了主类和相关的依赖项。

<groupId>com.example.MyApp</groupId>
<artifactId>MyApp</artifactId>
<version>1.0.0</version>
<build>
  <plugins>
     <plugin>
       <groupId>org.codehaus.mojo</groupId>
       <artifactId>exec-maven-plugin</artifactId>
       <version>1.2.1</version>
       <executions>
         <execution>
           <goals>
             <goal>java</goal>
          </goals>
         </execution>
       </executions>
       <configuration>
          <mainClass>com.example.myclass</mainClass>
          <arguments>
            <argument>configFile</argument>
            <argument>properties</argument>
          </arguments>
       </configuration>
     </plugin>

我还指定了许多依赖项......

<dependencies>
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
    <type>jar</type>
</dependency>
<dependency>
    <groupId>com.example.MyLibrary</groupId>
    <artifactId>MyLibrary</artifactId>
    <version>1.0.0</version>
</dependency>

MyApp程序读取一个配置文件,该文件作为命令行参数传入。配置文件包含位于MyLibrary的类的名称。因此,类可以是com.mypackage.driver.MyClass,它位于MyLibrary中,它是上面列出的MyApp jar的依赖项。 但是当我尝试运行时,我得到ClassNotFoundException ...

更新---- 我正在使用系统类加载器来加载在MyApp程序的命令行中传入的类

ClassLoader loader = ClassLoader.getSystemClassLoader();

我认为这会导致问题,因为它正在寻找默认类路径上不包含依赖项的类。

我在这里做错了什么提示?

5 个答案:

答案 0 :(得分:15)

你还在寻找这个问题的答案吗?我有完全相同的问题,最后想出来了。

您需要在配置中添加 includePluginDependencies ,以使插件搜索主类的依赖项:

<configuration>
  <includePluginDependencies>true</includePluginDependencies>
  <mainClass>com.example.myclass</mainClass>
  <arguments>
    <argument>configFile</argument>
    <argument>properties</argument>
  </arguments>
</configuration>

见这里:http://mojo.codehaus.org/exec-maven-plugin/java-mojo.html#includePluginDependencies

答案 1 :(得分:0)

您可以像这样生成类路径:

    <configuration>
      <executable>java</executable>
      <arguments>
        <argument>-Dmyproperty=myvalue</argument>
        <argument>-classpath</argument>
        <!-- automatically creates the classpath using all project dependencies,
             also adding the project build directory -->
        <classpath/>
        <argument>com.example.Main</argument>
        ...
      </arguments>
    </configuration>

答案 2 :(得分:0)

在从命令行执行之前,您还应该在命令行中导入库。您可以将此命令与您的库的特定名称和信息一起使用:

mvn install:install-file -Dfile=MyLibrary.jar -DgroupId=com.example.MyLibrary -DartifactId=MyLibrary -Dversion=1.0.0 -Dpackaging=jar

答案 3 :(得分:0)

您需要将依赖项添加为执行插件的依赖项,因此执行插件可以加载您配置的类com.example.myclass

<plugins>
 <plugin>
   <groupId>org.codehaus.mojo</groupId>
   <artifactId>exec-maven-plugin</artifactId>
   <version>1.2.1</version>
   [...]
   <dependencies>
     <dependency>
       <groupId>com.example.MyLibrary</groupId>
       <artifactId>MyLibrary</artifactId>
       <version>1.0.0</version>
       <type>jar</type>
     </dependency>

 </plugin>

答案 4 :(得分:0)

试试mvn clean compile exec:java

有时我们忘记编译代码,当你没有编译就运行mvn exec:java时,很明显maven找不到编译好的类文件并抱怨ClassNotFoundException