如何在可运行的jar中包含OJDBC驱动程序?

时间:2019-04-24 08:46:35

标签: java maven executable-jar ojdbc fatjar

我有一个Java项目,该项目连接到Oracle 12c数据库。以前,ojdbc jar(以及所有其他依赖项)必须位于classpath上才能运行。但是,这打算成为一个独立的应用程序,因此我想设置一个构建过程,最后将一个包含所有依赖项的jar吐出。我做了以下步骤:

  • 将项目转换为Maven项目
  • 将Log4j之类的依赖项设置为Maven依赖项
  • 按照this指南,我设法将ojdbc包含为依赖项
  • 设置maven-assembly-plugin以生成可运行的jar,如下所示:
select m.id_system, m.sensor, m.value, m.insert_date, s.name, s.type
join measures m
join system s on m.id_system = s.id_system
from (
    select m.id_system, m.sensor, max(m.insert_date) max_insert_date
    from measures m
    join system s on m.id_system = s.id_system and s.type = 'Type1'
    group by m.id_system, m.sensor
) t on t.id_system = m.id_system and 
       t.sensor = m.sensor and
       t.max_insert_date = m.insert_date
where s.type = 'Type1'

生成的jar以类文件的形式包含大多数依赖项,例如在包含Log4j类文件的jar的根目录中,有一个“ org / apache / log4j”文件夹。问题是ojdbc(com / oracle / jdbc)不存在,而我正在获得ClassNotFoundExceptions运行时。我检查了一下,并且.m2文件夹下的ojdbc jar位于正确的路径下。

有什么方法可以在我的可运行jar中以ojar或类文件的形式包含ojdbc依赖项?

编辑:基于Essex Boy的评论,我像这样使用了阴影插件:

<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,大多数依赖,但是ojdbc仍然被排除在外。我试图添加一个artifactSet标签​​,并明确包含“ com.oracle.jdbc:ojdbc8”,但仍然没有添加。唯一的好处是,通过使用minimumJar选项,我得到了一个较小的jar,其中仅包含实际的依赖项。

1 个答案:

答案 0 :(得分:-1)

找到答案了。你需要设置这个。 Class.forName("oracle.jdbc.driver.OracleDriver")

相关问题