0

所以我对 gradle 的工作方式相对缺乏经验,我需要一些帮助才能让我的 jar 工作。我的应用程序通过终端生成一些文件。但是,当我尝试运行 jar 时,它给了我一个错误。

构建.gradle:


plugins {
    id 'java'
}

group 'me.tl0x'
version '1.0'

repositories {
    mavenCentral()
}

jar {
    manifest {
        attributes (
                'Main-Class': 'me.tl0x.Main'
        )
    }
}

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'

    implementation 'org.freemarker:freemarker:2.3.29'
    implementation 'com.google.code.gson:gson:2.8.6'
    implementation 'org.jline:jline:3.21.0'
    implementation 'org.fusesource.jansi:jansi:2.4.0'

}

test {
    useJUnitPlatform()
}

错误信息:

PS C:\Path> java -jar ./build/libs/FabricModGenerator-1.0.jar
Exception in thread "main" java.lang.NoClassDefFoundError: org/jline/terminal/TerminalBuilder
        at me.tl0x.terminal.Interface.<init>(Interface.java:29)
        at me.tl0x.Main.main(Main.java:48)
Caused by: java.lang.ClassNotFoundException: org.jline.terminal.TerminalBuilder
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:636)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:182)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:519)
        ... 2 more

任何帮助将不胜感激。

4

1 回答 1

0

这基本上是因为您的类路径不包含“jline”和您的应用程序所需的其他内容。

  • 只需使用应用程序插件并让它做正确的事情(这是正确的答案......)

但是,如果您正在做的是实用的事情...

  • 创建一个做正确事情的任务,然后通过 gradle 运行它(因为你没有参数)
def asFileUrl(filepath) {
  return "file:///" + new java.net.URI(null, filepath, null).toASCIIString();
}


task LauncherJar(type: Jar) {
    appendix = "launcher"
    ext.launcherClasspath = { ->
      def verifyLibs = [
              configurations.runtimeClasspath.collect { asFileUrl(it.getCanonicalPath()) }.join(' '),
              asFileUrl(jar.archivePath.getCanonicalPath())
              ]
      return verifyLibs.join(' ')
    }
    manifest {
        attributes ("Class-Path": launcherClasspath())
    }
}

task execMyJar(type: JavaExec, dependsOn: [jar, LauncherJar]) {
    group = 'Execution'
    description = 'Do The thing that needs doing'
    classpath = files(LauncherJar.archivePath)
    mainClass = 'me.tl0x.Main'
}

然后你就可以做gradle execMyJar

请注意,在这里,我正在使用Class-PathManifest 文件中的元素创建一个启动器 jar。这样做的原因是为了避免命令行太长的情况(仅限 Windows?)...在您的情况下可能无关紧要,因为您没有列出那么多依赖项(但我不知道传递依赖项)。

于 2022-03-02T16:08:27.320 回答