Проблема со сборкой проекта с подключенной локальной библиотекой

у меня такая проблема, у меня есть локальная библиотека в виде jar файла, я подключил ее к проекту просто через pom.xml, в котором указал scope = system и путь. Когда я запускаю проект в idea - все работает, когда я сбираю проект в jar файл, а потом запускаю, у меня исключения по типу ClassNotFoundException, для классов как раз таки из локальной библиотеки. Как можно это решить?

Пробовал удалять проблемные классы.


Ответы (1 шт):

Автор решения: Nowhere Man

Удаление "проблемных" файлов не слишком подходит для решения проблемы с 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.

→ Ссылка