尝试将JDBC PostgreSQL 42.2依赖项添加到项目中。我的gradle.build
:
plugins {
id 'application'
}
group 'com.example'
version '0.1.0'
repositories {
mavenCentral()
}
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
implementation 'org.postgresql:postgresql:42.2.18' // добавляем зависимость
}
test {
useJUnitPlatform()
}
jar {
manifest {
attributes(
'Main-Class': 'com.example.service.Main'
)
}
}
并在 java 类中添加了一个检查:
try {
Class.forName("org.postgresql.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.exit(1);
}
编译通过./gradlew build
是成功的,但是当我尝试运行jar文件执行时,出现错误:
java.lang.ClassNotFoundException: org.postgresql.Driver
当我尝试查看 jar 文件的内容时,我得到以下信息:
META-INF/
META-INF/MANIFEST.MF
com/
com/example/
com/example/service/
com/example/service/Main.class
file.txt
我之前没有使用过 Java 和 Gradle,但据我了解,我在 中指定的依赖项build.gradle
应该从 Maven 存储库下载并自动添加到项目中。还是我需要自己下载依赖,添加到项目文件夹并classpath
在启动jar文件时指定?
请告诉我需要做什么才能使依赖项连接并正常工作?
默认情况下,该任务
jar
不包含存档中的依赖项,您需要一个任务fatjar
(厚罐)或jar
具有其他属性的任务。简要教程在这里:
根据上面的配置,编译的jar'nick中是不包含依赖的。您可以使用一些插件来更改默认构建。但是,您已经启用了应用程序插件。
该插件包括任务
distZip
和distTar
,它将构建存档,将必要的依赖项放入其中,您的库和可以正确运行您的应用程序的脚本(bash 版本和 bat)。这两个任务gradle assemble
在执行时都将作为依赖项运行(或gradle build
用于测试的完整周期)。当然它们也可以直接运行gradle distZip
。编译后的存档(zip 或 tar)可以在
build/distibutions
. 档案中的启动脚本本身将位于bin
.您唯一需要做的就是通过指定主类来配置它。
为了解决这个问题,有必要在任务中
jar
添加一个部分from
,我们将在其中将依赖项添加到我们的 jar 存档中。这里有两个重要的点:dependencies
我们在 section 中使用implementation,那么from
我们需要在 section 中指定compileClasspath。dependencies
我们连接到 as compilefrom
,那么我们需要在 section中指定compile我在一个地方使用实现,并在另一个地方编译。因此,所需的依赖项未包含在 jar 中。修复问题后,最终的 gradle.build 如下所示:
然后 jar 文件将包含我们需要的依赖项。在 Gradle 6.7 上测试。