繁体   English   中英

如何在Gradle JavaExec任务中添加类路径以执行可运行的jar?

[英]How to add classpath to Gradle JavaExec task to execute a runnable jar?

我的应用程序需要spring-context库。 因此,在我的build.gradle文件中,添加了此依赖项,

dependencies {
    compile 'org.springframework:spring-context:5.1.6.RELEASE'
}

我还想创建一个可运行的jar文件,这个jar任务看起来像,

jar {
    manifest {
        attributes 'Main-Class': 'my.package.my.main.class'
    }
}

启动构建文件时一切正常,

gradle build

但是当我尝试执行这个可运行的jar应用程序时,

task runJar(dependsOn: jar, type: JavaExec) {
    classpath(configurations.compile)
    main = '-jar'; args 'build/libs/my-runnable.jar'
}

控制台抛出NoClassDefFoundError

Exception in thread "main" java.lang.NoClassDefFoundError: 
org/springframework/context/ConfigurableApplicationContext
...
...

我试过了sourceSets.main.runtimeClasspath ,问题仍然存在,

task runJar(dependsOn: jar, type: JavaExec) {
    classpath(sourceSets.main.runtimeClasspath)
    main = '-jar'; args 'build/libs/my-runnable.jar'
}

我检查了classpath文件集合,

classpath.each {
    println it.name
}

spring-context包就在那里,

spring-context-5.1.6.RELEASE.jar
spring-aop-5.1.6.RELEASE.jar
spring-beans-5.1.6.RELEASE.jar
spring-expression-5.1.6.RELEASE.jar
spring-core-5.1.6.RELEASE.jar
spring-jcl-5.1.6.RELEASE.jar

然后,我尝试了另一种解决方法。 我从这些.jar库中提取了所有类文件,并将它们直接包含在最终的runnable.jar

jar {
    manifest {
        attributes 'Main-Class': 'my.package.my.main.class'
    }

    configurations.compile.each {
        from(project.zipTree(it))
    }
}

并且此解决方案有效。 但是这样的“胖子”不是我想要的。

我是gradle的新手。 这真的让我感到困惑。 有人可以帮忙吗? 谢谢!

经过大约3个小时的工作,一个简单的事实是:

当指定-jar时,-cp参数将被忽略。

这个问题有一些详细的讨论:

从命令行运行JAR文件并指定类路径

有两种简单的解决方案:

  1. 正如我在问题中提到的,将所有.class文件直接提取到您的可执行jar中。
jar {
    manifest {
        attributes 'Main-Class': 'my.package.my.main.class'
    }

    configurations.compile.each {
        from(project.zipTree(it))
    }
}
  1. 第二种解决方案是在manifest文件中添加Class-Path参数。
jar {
    manifest {
        attributes 'Main-Class': 'your.main.class.full.name'
        attributes 'Class-Path': configurations.compile.collect { it.name }.join(' ')
    }
}

确保可以在本地系统中找到.jar库。 例如,只需将它们复制到同一目录中,

task copyLibs(type: Copy) {
    from configurations.compile
    into 'build/libs/'
}

之后,我的build/libs/目录如下所示:

build
├── libs
│   ├── my-runnable-app.jar
│   ├── spring-aop-5.1.6.RELEASE.jar
│   ├── spring-beans-5.1.6.RELEASE.jar
│   ├── spring-context-5.1.6.RELEASE.jar
│   ├── spring-core-5.1.6.RELEASE.jar
│   ├── spring-expression-5.1.6.RELEASE.jar
│   └── spring-jcl-5.1.6.RELEASE.jar

请注意,所有.jar库都位于my-runnable-app.jar 如果要将它们包括在my-runnable-app.jar ,则需要One-Jar工具箱。 有关One-Jar更多信息,请阅读以下问题:

罐子内的参考罐

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM