Ответ 1
Используйте 'compile' для запуска maven exec plugin - mvn exec:java -Dexec.classpathScope=compile
. Это будет включать зависящие от системы зависимости.
У меня есть проект, который использует область "system" для указания файла jar, включенного в мой проект WEB-INF/lib
dir. Этот артефакт не находится ни в одном из репозиториев 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>
Это отлично работает для большинства вещей.
Но теперь я пытаюсь запустить некоторый код в командной строке (вне моего webapp, с помощью метода main()
, который я добавил), и mvn exec:java
не может разрешить код в MySpecialLib, потому что он не включен в путь к классам "runtime".
Как я могу:
или
mvn exec:java
также использовать путь класса system
?Я пробовал mvn exec:java -Dexec.classpathScope=system
, но это оставляет все, что на runtime
.
Используйте 'compile' для запуска maven exec plugin - mvn exec:java -Dexec.classpathScope=compile
. Это будет включать зависящие от системы зависимости.
Интересно знать, что classpathScope=system
снижает runtime
зависимости. Я обнаружил, что включение его в качестве plugin
в pom.xml
работает как альтернатива. Не могли бы вы попробовать и сообщить мне, если это сработает для вас?
Итак, я добавил зависимость уровня системы с коллекцией коллекций как пример, подобный вашему артефакту: -
<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>
Затем в теге <build>
у меня есть плагин 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
.
Надеюсь, что это поможет.
См. сборка Maven 2 с зависимостями: jar under scope "system" не включены
Правильный ответ - использовать maven-install-plugin и Put The Jar Into Your Local Repo. Или, еще лучше, запустите nexus или artifactory и используйте плагин развертывания, чтобы поставить банку туда. System classpath - это всего лишь мир боли.
Как E.G. указано, что решение заключается в использовании области компиляции при запуске exec.
При каждом вызове:
mvn exec:java -Dexec.classpathScope=compile
или непосредственно в конфигурации exec-plugin:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
...
<configuration>
<classpathScope>compile</classpathScope>
</configuration>
</plugin>