Maven exec плагин ClassNotFoundException

я использую плагин 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>

на считывает конфигурационный файл, который передается в качестве аргумента командной строки. Файл конфигурации содержит имя класса, который находится в MyLibrary. Таким образом, класс может быть com.mypackage.driver.MyClass который расположен в MyLibrary, который является зависимость MyApp jar перечисленные выше. Однако, когда я пытаюсь запустить это, я получаю ClassNotFoundException...

обновление---- Я использую системный загрузчик классов для загрузки классов, которые передаются в командной строке для MyApp - программы

ClassLoader loader = ClassLoader.getSystemClassLoader();

Я думаю, что это вызывает проблему, поскольку она ищет классы по умолчанию classpath, который не содержит зависимостей.

какие-то намеки от того,что я делаю не так?

4 ответов


вы все еще ищете ответ на этот вопрос? У меня была точно такая же проблема, и, наконец, я понял это.

вам нужно добавить 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


прежде чем выполнять из командной строки, вы должны импортировать также в командной строке свою библиотеку. Вы можете использовать эту команду с вашим именем и информацией о вашей библиотеке:

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

вам нужно добавить зависимость как зависимость плагина выполнения, чтобы плагин выполнения мог загрузить настроенный вами класс 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>

вы можете позволить пути к классам генерироваться следующим образом:

    <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>