使用gradle创建可运行* .jar时的NoClassDefFoundError:org / slf4j / LoggerFactory

时间:2016-09-28 12:37:57

标签: java gradle jar build slf4j

我正在尝试使用gradle和应用程序插件为我的应用程序创建一个可运行的* .jar文件。

构建以无错误结束,清单文件正常等等,但是当运行* .jar文件时会发生这种情况:

<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
    x:Class="Coc.Core.StartUpPage" 
    xmlns:local="clr-namespace:Coc.Core"
    Title ="Home">

很明显我错过了这个库,但它被指定:

的build.gradle

java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
    at main.Launcher.<clinit>(Launcher.java:19)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 1 more
Exception in thread "main" 
Process finished with exit code 1

创建的清单如下:

group 'Comparator'
version '0.9'

apply plugin: 'java'
apply plugin: 'application'

mainClassName = "main.Launcher"

compileJava {
    //enable compilation in a separate daemon process
    options.fork = true
    //enable incremental compilation
    options.incremental = true
}

repositories {
    mavenCentral()

}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.11'
    // GraphStream Core
    compile group: 'org.graphstream', name: 'gs-core', version: '1.3'
    // GraphStream
    //UI
    compile group: 'org.graphstream', name: 'gs-ui', version: '1.3'
    // GraphStream
    //algo
    compile group: 'org.graphstream', name: 'gs-algo', version: '1.3'
    // Jena
    // https://mvnrepository.com/artifact/org.apache.jena/jena-arq
    compile group: 'org.apache.jena', name: 'jena-arq', version: '2.13.0'
    compile group: 'org.apache.jena', name: 'jena-querybuilder', version: '2.13.0'

    // Log
    compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.21'

    compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.0.9'
    compile group: 'ch.qos.logback', name: 'logback-core', version: '1.0.9'
    // https://mvnrepository.com/artifact/org.jgrapht/jgrapht-core
    compile group: 'org.jgrapht', name: 'jgrapht-core', version: '0.9.2'
    compile group: 'org.jgrapht', name: 'jgrapht-jdk1.5', version: '0.7.3'
    compile group: 'org.jgrapht', name: 'jgrapht-ext', version: '0.9.2'
    // CSV parser
    compile group: 'com.univocity', name: 'univocity-parsers', version: '1.0.0'

    // https://mvnrepository.com/artifact/com.google.guava/guava
    compile group: 'com.google.guava', name: 'guava', version: '11.0.2'


}

jar {
    manifest {
        attributes 'Main-Class': mainClassName,
                'Class-Path': configurations.runtime.files.collect { "$it.name" }.join(' ')
    }
}

请注意,它确实包含slf4j,但我仍然得到异常。 有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

过了一段时间,我来到(我认为是)解决方案。这对生成的类路径有不同的依赖关系是个大问题。从头开始生成项目并导入代码和资源证明是一个成功的构建。

如果您遇到相同的错误,我建议使用相同的解决方案,只需从头开始重建项目。

是的,可能有更好的解决方案,但我在1个月内找不到它。

答案 1 :(得分:0)

我认为问题出在导入的库中的定义冲突,这些库也引用了sl4j。使用maven,我必须手动添加指令以将这些引用从其他库中排除。

     <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.5</version>
        <exclusions>
            <exclusion>
                <artifactId>org.slf4j</artifactId>
                <groupId>slf4j-api</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.5</version>
        <exclusions>
            <exclusion>
                <artifactId>org.slf4j</artifactId>
                <groupId>slf4j-log4j12</groupId>
            </exclusion>
        </exclusions>
    </dependency>