Подтвердить что ты не робот

Плагин Maven exec - как включить "системный" путь к классам?

У меня есть проект, который использует область "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".

Как я могу:

  • добавить MySpecialLib в путь к среде выполнения

или

  • сообщить mvn exec:java также использовать путь класса system?

Я пробовал mvn exec:java -Dexec.classpathScope=system, но это оставляет все, что на runtime.

4b9b3361

Ответ 1

Используйте 'compile' для запуска maven exec plugin - mvn exec:java -Dexec.classpathScope=compile. Это будет включать зависящие от системы зависимости.

Ответ 2

Интересно знать, что 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.

Надеюсь, что это поможет.

Ответ 4

Правильный ответ - использовать maven-install-plugin и Put The Jar Into Your Local Repo. Или, еще лучше, запустите nexus или artifactory и используйте плагин развертывания, чтобы поставить банку туда. System classpath - это всего лишь мир боли.

Ответ 5

Как 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>