3

我有一个 Java 项目,它连接到 Oracle 12c 数据库。以前,ojdbc jar(和所有其他依赖项)必须位于类路径上才能使 jar 能够运行。然而,这是一个独立的应用程序,所以我想设置一个构建过程,最终吐出一个包含所有依赖项的 jar。我做了以下步骤:

  • 将项目转换为 Maven 项目
  • 将 Log4j 等依赖项设置为 Maven 依赖项
  • 按照指南,我设法将 ojdbc 作为依赖项包含在内
  • 设置 maven-assembly-plugin 以生成一个可运行的 jar,如下所示:
<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 以类文件的形式包含大部分依赖项,例如,在 jar 的根目录中有一个“org/apache/log4j”文件夹,其中包含 Log4j 类文件。问题是 ojdbc (com/oracle/jdbc) 不存在,并且我正在获取 ClassNotFoundExceptions 运行时。我检查了 ojdbc jar 存在于我的 .m2 文件夹下的正确路径中。

有没有办法在我的可运行 jar 中包含 ojdbc 依赖项,无论是作为 jar 还是作为类文件?

编辑:根据 Essex Boy 的评论,我使用了这样的阴影插件:

<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”,但仍然没有添加。唯一的好处是,使用 minimizeJar 选项,我得到了一个较小的 jar,其中仅包含实际依赖项。

4

1 回答 1

-1

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

于 2021-06-03T10:44:09.620 回答