2017-10-18 136 views
0

我有2个java文件:线程“main”中的异常java.lang.NoClassDefFoundError:与控制台一起运行时。可能的Maven相关

package com.pokebot; 

import javax.security.auth.login.LoginException; 
import net.dv8tion.jda.core.AccountType; 
import net.dv8tion.jda.core.JDA; 
import net.dv8tion.jda.core.JDABuilder; 
import net.dv8tion.jda.core.exceptions.RateLimitedException; 

public class App { 

    public static void main(String[] args) 
    { 
     try { 
      JDA jdaBot = new JDABuilder(AccountType.BOT).setToken("my_token").buildBlocking(); 
      jdaBot.addEventListener(new Pokebot()); 
     } catch (LoginException e) { 
    //   System.out.println("LoginException"); 
     } catch (InterruptedException e) { 
    //   System.out.println("InterruptedException"); 
     } catch (RateLimitedException e) { 
    //   System.out.println("RateLimitedException"); 
     } 
    } 

} 

和:

package com.pokebot; 

import net.dv8tion.jda.core.entities.Message; 
import net.dv8tion.jda.core.entities.MessageChannel; 
import net.dv8tion.jda.core.entities.User; 
import net.dv8tion.jda.core.events.message.MessageReceivedEvent; 
import net.dv8tion.jda.core.hooks.ListenerAdapter; 

public class Pokebot extends ListenerAdapter { 

    @Override 
    public void onMessageReceived(MessageReceivedEvent e) { 

     //Obtains properties of the received message 
     Message objMsg = e.getMessage(); 
     MessageChannel objChannel = e.getChannel(); 
     User objUser = e.getAuthor(); 

     //Responds to any user who says "hello" 
     if (objMsg.getContent().equals("hello")) { 
      objChannel.sendMessage("Hello, " + objUser.getAsMention() +"!").queue(); 
     } 

    } 
} 

当我运行应用程序(主类是从1号文件app)从NetBeans中,我得到的只有一个通知:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". 

但该应用程序仍然有效。 当我尝试从命令行运行它:

java -jar target/pokebotapp-1.0-SNAPSHOT.jar 

然后我得到一个例外是这样的:

Exception in thread "main" java.lang.NoClassDefFoundError: net/dv8tion/jda/core/exceptions/RateLimitedException

Error: A JNI error has occurred, please check your installation and try again 
Exception in thread "main" java.lang.NoClassDefFoundError: net/dv8tion/jda/core/ 
exceptions/RateLimitedException 
     at java.lang.Class.getDeclaredMethods0(Native Method) 
     at java.lang.Class.privateGetDeclaredMethods(Unknown Source) 
     at java.lang.Class.privateGetMethodRecursive(Unknown Source) 
     at java.lang.Class.getMethod0(Unknown Source) 
     at java.lang.Class.getMethod(Unknown Source) 
     at sun.launcher.LauncherHelper.validateMainClass(Unknown Source) 
     at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source) 
Caused by: java.lang.ClassNotFoundException: net.dv8tion.jda.core.exceptions.Rat 
eLimitedException 
     at java.net.URLClassLoader.findClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     ... 7 more 

,应用程序甚至不启动。

我在这个项目中使用Maven。我的pom.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.pokebot</groupId> 
    <artifactId>pokebotapp</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>jar</packaging> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-jar-plugin</artifactId> 
       <version>3.0.2</version> 
       <configuration> 
        <archive> 
         <manifest> 
          <addClasspath>true</addClasspath> 
          <!--<classpathPrefix>lib/</classpathPrefix>--> 
          <mainClass>com.pokebot.App</mainClass> 
         </manifest> 
        </archive> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-dependency-plugin</artifactId> 
       <version>2.5.1</version> 
       <executions> 
        <execution> 
         <id>copy-dependencies</id> 
         <phase>package</phase> 
         <goals> 
          <goal>copy-dependencies</goal> 
         </goals> 
         <configuration> 
          <outputDirectory> 
           ${project.build.directory}/dependency-jars/ 
          </outputDirectory> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 
    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <maven.compiler.source>1.8</maven.compiler.source> 
     <maven.compiler.target>1.8</maven.compiler.target> 
    </properties> 
    <dependencies> 
     <dependency> 
      <groupId>net.dv8tion</groupId> 
      <artifactId>JDA</artifactId> 
      <version>3.3.1_291</version> 
     </dependency> 
    </dependencies> 
    <repositories> 
     <repository> 
      <id>jcenter</id> 
      <name>jcenter-bintray</name> 
      <url>http://jcenter.bintray.com</url> 
     </repository> 
    </repositories> 
    </project> 

之前,我尝试从控制台运行的项目,我运行maven compile。我认为这可能是我运行程序的方式或我为这个项目设置maven的方式的错误。有没有人知道可能是什么问题?

+0

阅读本https://stackoverflow.com/questions/7421612/slf4j-failed-to-load-class-org-slf4j-impl-staticloggerbinder – Lokesh

+0

我添加Maven依赖于'SLF4J-API - 1.7.5'和'slf4j-simple-1.7.5',但仍然有同样的问题,即使在mvn clean install – Lurker

+0

你更新你的项目并检查强制更新快照和版本吗? – Lokesh

回答

1

这是因为java不知道从哪里获取这个库。几个选项:

  1. 构建包含所有依赖包的jar(所谓的超级jar)。这是用maven shade插件完成的。文档可在这里:https://maven.apache.org/components/plugins/maven-shade-plugin/examples/executable-jar.html

  2. 做Java的罐子-cP 文档是在这里:http://docs.oracle.com/javase/7/docs/technotes/tools/windows/classpath.html

第一选择肯定是更好的:)我想应该有很多的例子在计算器如何配置Maven的遮阳帘插件。就像这样: What is the maven-shade-plugin used for, and why would you want to relocate java packages?

+0

只需添加maven插件即可解决问题。谢谢:) – Lurker

+0

欢迎:) –

相关问题