我有一个 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,其中仅包含实际依赖项。