У меня есть проект Java, который подключается к базе данных Oracle 12c. Ранее jar ojdbc (и все другие зависимости) должны были находиться в пути к классам, чтобы jar мог работать. Однако это должно быть автономное приложение, поэтому я хотел настроить процесс сборки, который в конце выдает один jar со всеми зависимостями. Я сделал следующие шаги:
- Преобразован проект в проект Maven
- Установить зависимости, такие как Log4j, как зависимости Maven
- Следуя этому руководству, мне удалось включить ojdbc в качестве зависимости
- Настройте maven-assembly-plugin для генерации работающего фляги как это:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>fully.qualified.path.to.Main</mainClass>
</manifest>
<manifestEntries>
<Built-On>${maven.build.timestamp} UTC</Built-On>
<ModuleName>${project.name}</ModuleName>
<ModuleVersion>${project.version}</ModuleVersion>
</manifestEntries>
<manifestSections>
<manifestSection>
<name>Release section</name>
<manifestEntries>
<BaseVersion>${baseversion}</BaseVersion>
<BuildNumber>${buildnumber}</BuildNumber>
<GITRevision>${gitrevision}</GITRevision>
</manifestEntries>
</manifestSection>
</manifestSections>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
Полученный jar содержит большинство зависимостей в виде файлов классов, например, в корне фляги есть папка 'org / apache / log4j' с файлами классов Log4j. Проблема в том, что ojdbc (com / oracle / jdbc) не существует, и я получаю время выполнения ClassNotFoundExceptions. Я проверил, и файл ojdbc jar находится в моей папке .m2 по правильному пути.
Есть ли способ включить зависимости ojdbc в виде jar-файла или файла класса в мой исполняемый jar-файл?
РЕДАКТИРОВАТЬ: Основываясь на комментарии Essex Boy, я использовал плагин Shade следующим образом:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<minimizeJar>true</minimizeJar>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestEntries>
<Main-Class>fully.qualified.path.to.Main</Main-Class>
<Built-On>${maven.build.timestamp} UTC</Built-On>
<ModuleName>${project.name}</ModuleName>
<ModuleVersion>${project.version}</ModuleVersion>
<BaseVersion>${baseversion}</BaseVersion>
<BuildNumber>${buildnumber}</BuildNumber>
<GITRevision>${gitrevision}</GITRevision>
</manifestEntries>
</transformer>
</transformers>
</configuration>
</plugin>
С этим я получаю подобный jar с большинством зависимостей, но ojdbc все еще исключен. Я попытался добавить тег artifactSet и явно включить com.oracle.jdbc: ojdbc8, но все равно он не был добавлен. Единственным преимуществом является то, что с параметром minimalJar я получаю баночку меньшего размера с включенными только фактическими зависимостями.