Как включить драйвер OJDBC в работающий jar? - PullRequest
2 голосов
/ 24 апреля 2019

У меня есть проект 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 я получаю баночку меньшего размера с включенными только фактическими зависимостями.

...