Java Sqlite Gradle

4

我对Gradle和Java都很陌生...

我有一个使用SQLite的项目,它在IntelliJ IDEA中可以运行得很好,但我无法从终端中运行它,会抛出异常:

java.lang.ClassNotFoundException: org.sqlite.JDBC

我曾尝试获取IntelliJ IDEA运行项目时产生的进程:
/usr/lib/jvm/java-7-openjdk-amd64/bin/java -agentlib:jdwp=transport=dt_socket,server=n,suspend=y,address=42986 -Dfile.encoding=UTF-8 -cp /home/user/my_project/target/classes/main:/home/user/my_project/target/resources/main:/home/user/.gradle/caches/modules-2/files-2.1/org.xerial/sqlite-jdbc/3.7.2/7a3d67f00508d3881650579f7f228c61bfc1b196/sqlite-jdbc-3.7.2.jar Main

我看到这里的想法是指定类路径,这是解决方案,但是如何在不指定类路径的情况下运行项目的 .jar 文件呢?我的意思是,gradle 是否可以自动生成清单文件(因为它能成功从 Maven org.xerial 存储库检索 sqlite-jdbc),并在其中放置有效的类路径?
我希望能够成功地从终端运行它。
更新:我无法通过终端上的 gradle run 命令运行它,但我也无法通过 java -jar myproject.jar 命令运行该项目。
以下是我的build.gradle文件:
apply plugin: 'java'
apply plugin: 'maven'
apply plugin: 'idea'
apply plugin: 'application'

group = 'myproject'
version = '0.3'

description = """my project description"""

buildDir = "target"

mainClassName = "Main"

repositories {
     maven { url "http://repo.maven.apache.org/maven2" }
}

dependencies {
    testCompile group: 'junit', name: 'junit', version:'3.8.1'
    compile 'org.xerial:sqlite-jdbc:3.7.2'
}


jar {
    manifest.attributes("Main-Class": "Main")
}

/* Overwriting distribution tasks: */
task distZip(type:Zip, overwrite:true) {
    archiveName = "$project.name-$version" + '.zip'
    from "target/libs"
}

task distTar(type:Tar, overwrite:true) {
    archiveName = "$project.name-$version" + '.tar'
    from "target/libs"
}

抛出异常的Java源代码:

try {
    Class.forName("org.sqlite.JDBC");

    this.connection = DriverManager.getConnection(databaseName);
} catch (Exception e) {
    e.printStackTrace();
}

源代码?build.gradle文件内容? - fge
应用程序插件将在使用 gradle run 执行应用程序时自动提供 compile(和 runtime)依赖项。您可以通过使用 --info 日志级别执行 Gradle 来验证此操作。 - Peter Niederwieser
1个回答

2

我通过修改jar部分,将sqlite添加到项目的分发jar文件的类路径中,从而解决了这个问题:

task copyDependenciesToTarget(type: Copy) {
    println 'Copying dependencies to target...'

    configurations.compile.collect().each { compileDependency ->
        copy {
            with from (compileDependency.getPath()) {
                include '*'
            }
            into 'target/libs/libs'
        }
    }
}

build.dependsOn(copyDependenciesToTarget)


jar {
    manifest.attributes(
            "Main-Class": "Main",
            "Class-Path": configurations.compile.collect { 'libs/' + it.getName()}.join(' ')
    )
}

现在 Gradle 会下载依赖项并将它们复制到 libs/ 目录中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接