2015-01-08 25 views
0

我正在使用Trident风暴并试图在函数prepare方法内启动一个网格实例。同样的配置文件适用于本地集群。当我在remore集群中提交它时,我得到错误。Gridgain异常java.lang.IncompatibleClassChangeError:实现类

代码:

public class MemoryGrid extends BaseFunction { 

private static final long serialVersionUID = -4574506761580804738L; 
private static final String configFileLocation = "file:///home/path/config.xml"; 
MemGridDAO memgriddao; 
public void prepare(Map conf, TridentOperationContext context){ 
    this.memgriddao = new MemGridDAO (configFileLocation); 
} 
public void execute(TridentTuple tuple, TridentCollector collector) { 
    try { 
     memgriddao.put("cahcename",tuple.getValue(0),tuple.getValue(1)); 
    } catch (GridException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    collector.emit(null); 
} 

public class MemGridDAO { 

    public MemGridDAO(String configFile){ 

    Grid grid = GridGain.start(configFile); 
    } 

    } 

错误

java.lang.IncompatibleClassChangeError: Implementing class 
    at java.lang.ClassLoader.defineClass1(Native Method) ~[na:1.7.0_45] 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:800) ~[na:1.7.0_45] 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) ~[na:1.7.0_45] 
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) ~[na:1.7.0_45] 
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71) ~[na:1.7.0_45] 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361) ~[na:1.7.0_45] 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) ~[na:1.7.0_45] 
    at java.security.AccessController.doPrivileged(Native Method) ~[na:1.7.0_45] 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) ~[na:1.7.0_45] 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425) ~[na:1.7.0_45] 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) ~[na:1.7.0_45] 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358) ~[na:1.7.0_45] 
    at java.lang.Class.forName0(Native Method) ~[na:1.7.0_45] 
    at java.lang.Class.forName(Class.java:190) ~[na:1.7.0_45] 
    at org.gridgain.grid.util.GridUtils.addLog4jNoOpLogger(GridUtils.java:7697) ~[stormjar.jar:na] 
    at org.gridgain.grid.kernal.GridGainEx.start(GridGainEx.java:732) ~[stormjar.jar:na] 
    at org.gridgain.grid.kernal.GridGainEx.start(GridGainEx.java:677) ~[stormjar.jar:na] 
    at org.gridgain.grid.kernal.GridGainEx.start(GridGainEx.java:524) ~[stormjar.jar:na] 
    at org.gridgain.grid.kernal.GridGainEx.start(GridGainEx.java:494) ~[stormjar.jar:na] 
    at org.gridgain.grid.GridGain.start(GridGain.java:314) ~[stormjar.jar:na] 

回答

1

它看起来像你有你的远程集群应用程序的classpath Log4j的jar文件的多个不兼容的版本(最有可能的,其中之一是GridGain依赖,另一种是已经存在的应用程序依赖)。

您需要使用与GridGain相同版本的Log4j或配置GridGain以使用非log4j日志记录。例如,如果您想保留您的Log4j版本,则可以使用GridSlf4jLogger和适当的SLF4j-to-Log4j绑定。

1

这可能是一个汇编的问题。尝试做一个干净的构建。这可能是因为所有相关类之间的.class文件不匹配。

IncompatibleClassChangeError扩展了LinkageError,它与从编译子类后发生更改的基类出现的问题有关。

更多内容:http://examples.javacodegeeks.com/java-basics/exceptions/java-lang-incompatibleclasschangeerror-how-to-resolve-incompatible-class-change-error/

+0

谢谢..这是由于该项目内有多个log4j罐子。我做了一些清理并投入了网格增值版本,它运行良好。 – user3072054