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>