Проблема со сборкой проекта с подключенной локальной библиотекой
у меня такая проблема, у меня есть локальная библиотека в виде jar файла, я подключил ее к проекту просто через pom.xml, в котором указал scope = system и путь. Когда я запускаю проект в idea - все работает, когда я сбираю проект в jar файл, а потом запускаю, у меня исключения по типу ClassNotFoundException, для классов как раз таки из локальной библиотеки. Как можно это решить?
Пробовал удалять проблемные классы.
Ответы (1 шт):
Удаление "проблемных" файлов не слишком подходит для решения проблемы с ClassNotFoundException.
Согласно документации Мaven и её переводу
Область действия зависимости
scopeопределяет этап жизненного цикла проекта, в котором эта зависимость будет использоваться. Maven использует 6 областей :
...
provided- очень похоже наcompile, но эта зависимость в сборку не попадает. Предполагается, что зависимость (артефакт) уже присутствует в JDK или в WEB-контейнере. Эта область доступна только на этапах компиляции и тестирования и не является транзитивной;
...system- область похожа наprovidedза исключением того, что необходимо определить физическое расположение артефакта на диске. Артефакт с этой областью видимости maven не ищет в репозитории;
Кроме того, этот параметр является устаревшим.
Ранее он применялся для ссылок на .jar-файлы, которые теперь предоставляются JDK или VM, например расширения JDBC javax.sql:
<project>
...
<dependencies>
<dependency>
<groupId>javax.sql</groupId>
<artifactId>jdbc-stdext</artifactId>
<version>2.0</version>
<scope>system</scope>
<systemPath>${java.home}/lib/rt.jar</systemPath>
</dependency>
</dependencies>
...
</project>
Таким образом, если используется system, то следует гарантировать, что .jar-файл с соответствующими классами будет находиться где-то в соответствующей директории, на которую указывает systemPath (вероятно, потребуется жёстко закодировать полный путь к jar-файлу).
<dependency>
<groupId>grillid9.laslib</groupId>
<artifactId>loveLas</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>system</scope>
<systemPath>C:\mylib\loveLas-1.0-SNAPSHOT.jar</systemPath>
</dependency>
И соответствующий .jar должен копироваться строго в указанную директорию.
Вероятно, всё же проще/разумнее следовало бы использовать значение scope по умолчанию compile, тогда соответствующая зависимость станет доступна, так как библиотечные классы будут запакованы в тот же .jar файл, что и основное приложение, или хотя бы scope = provided, тогда можно было бы предоставить доступ к библиотеке через параметр classpath.