使用 gradle 构建 Jar - Jar 没有 sql 依赖项

Building a Jar using gradle - Jar hasn't sql dependency

我正在尝试构建一个非常简单的程序。 我只有一个依赖项,msql-jdbc.

每次构建都成功。但是,如果我尝试 运行 罐子,则会抛出此异常:

Error: Could not find or load main class metaDataDB-0.5-msSQL.jar Caused by: java.lang.ClassNotFoundException: metaDataDB-0.5-msSQL.jar

如果我查看 jar,例如 7zip,我会看到所有已编译的 类。

MANIFEST.MF内容如下:

Manifest-Version: 1.0
Main-Class: metaDataDB.Main

也许这有助于: Project Structure in Intellij

这是我的完整构建:

plugins {
    id 'java'
}

jar{
    manifest {
        attributes 'Main-Class': 'metaDataDB.Main'
    }
}

repositories {
    mavenCentral()
}

group 'com.dvb'
//version '1.0-SNAPSHOT'
version '0.5-msSQL'
sourceCompatibility = 17


dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2'
    // https://mvnrepository.com/artifact/org.postgresql/postgresql
    //implementation group: 'org.postgresql', name: 'postgresql', version: '42.3.1'
    // / https://mvnrepository.com/artifact/com.microsoft.sqlserver/mssql-jdbc
    // https://mvnrepository.com/artifact/com.microsoft.sqlserver/mssql-jdbc
    implementation group: 'com.microsoft.sqlserver', name: 'mssql-jdbc', version: '9.5.0.jre17-preview'
}

test {
    useJUnitPlatform()
}

我是不是设置错了什么?这是 Intellij 错误吗? 我真的很困惑。我认为它应该有效...

编辑: 我犯了错误,我执行了错误的 java 命令。 我之前的做法:

java metaDataDB-0.5-msSQL.jar -login:login.txt

正确的做法:

java -jar metaDataDB-0.5-msSQL.jar -login:login.txt

但知道我还有另一个问题。我的 jdbc 驱动程序未包含在 Jarfile 中

问题存在于 msSQL.jar,缺少一些 类 我想,您可以转到 https://mvnrepository.com/artifact/com.microsoft.sqlserver/mssql-jdbc 并为您的 JRE 实施正确的 jar 或尝试不同的版本。

第一个问题是, 我以错误的方式执行了 Jar 文件。

我做到了

java metaDataDB-0.5-msSQL.jar -login:login.txt

正确的做法:

java -jar metaDataDB-0.5-msSQL.jar -login:login.txt

在那之后,我意识到我没有将所需的依赖项包含到我的 Jar 中。 我了解了 Fat Jar 文件是什么。

所以我需要将其添加到我的 gradle jar 任务中:

 from{
        configurations.runtimeClasspath.collect {it.isDirectory() ? it: zipTree(it)}
    }

供参考我的整个 build.gradle 文件:

plugins {
    id 'java'
}

jar{
    manifest {
        attributes ('Main-Class': 'metaDataDB.Main')
    }
    from{
        configurations.runtimeClasspath.collect {it.isDirectory() ? it: zipTree(it)}
    }

}

repositories {
    mavenCentral()
}

group 'com.dvb'
//version '1.0-SNAPSHOT'
version '0.5-msSQL'
sourceCompatibility = 17


dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2'
    // https://mvnrepository.com/artifact/org.postgresql/postgresql
   // implementation group: 'org.postgresql', name: 'postgresql', version: '42.3.1'
    implementation 'com.microsoft.sqlserver:mssql-jdbc:10.1.0.jre17-preview'
    // / https://mvnrepository.com/artifact/com.microsoft.sqlserver/mssql-jdbc
    // https://mvnrepository.com/artifact/com.microsoft.sqlserver/mssql-jdbc
    //implementation 'com.microsoft.sqlserver:mssql-jdbc:9.2.1.jre15'

}

test {
    useJUnitPlatform()
}

这适用于 postgressql 驱动程序。

对于 Microsoft SQL 驱动程序,出现了一个新问题。

java -jar metaDataDB-0.5-msSQL.jar -login:ms.txt
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes
        at java.base/sun.security.util.SignatureFileVerifier.processImpl(SignatureFileVerifier.java:340)
        at java.base/sun.security.util.SignatureFileVerifier.process(SignatureFileVerifier.java:282)
        at java.base/java.util.jar.JarVerifier.processEntry(JarVerifier.java:277)
        at java.base/java.util.jar.JarVerifier.update(JarVerifier.java:234)
        at java.base/java.util.jar.JarFile.initializeVerifier(JarFile.java:762)
        at java.base/java.util.jar.JarFile.ensureInitialization(JarFile.java:1033)
        at java.base/java.util.jar.JavaUtilJarAccessImpl.ensureInitialization(JavaUtilJarAccessImpl.java:72)
        at java.base/jdk.internal.loader.URLClassPath$JarLoader.getManifest(URLClassPath.java:883)
        at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:848)
        at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
        at java.base/java.lang.Class.forName0(Native Method)
        at java.base/java.lang.Class.forName(Class.java:467)
        at java.base/sun.launcher.LauncherHelper.loadMainClass(LauncherHelper.java:780)
        at java.base/sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:675)

这里有一个 link 例外:

https://docs.microsoft.com/de-de/dotnet/api/system.security.securityexception?view=net-6.0

我在管理员模式下尝试 运行,但也失败了...

但我想这是一个新问题,与 gradle 没有任何关系。

我想“使用 gradle 构建 Jar - Jar 没有 sql 依赖项”的答案已得到解答。

我将为 Microsoft sql 驱动程序创建一个新问题,并在此处 link 它。

(希望我做对了)