使用gfsh启动Gemfire:gfsh启动服务器中出现ClassNotFound错误



我有以下环境:OS-Windows7

环境变量集:

CLASSPATH = C:MyWorkspacePivotal_GemFire_800_b48398_Windowslibgemfire.jar;C:MyWorkspacePivotal_GemFire_800_b48398_Windowslibantlr.jar;C:MyWorkspacePivotal_GemFire_800_b48398_Windowslibgfsh-dependencies.jar;C:MyWorkspacePivotal_GemFire_800_b48398_WindowslibgfSecurityImpl.jar;C:MyWorkspacePivotal_GemFire_800_b48398_Windowslibjackson-core-2.2.0.jar;C:MyWorkspacePivotal_GemFire_800_b48398_Windowslibcommons-logging-1.1.1.jar;C:MyWorkspacePivotal_GemFire_800_b48398_Windowslibtomcat-embed-core.jar;C:MyWorkspacePivotal_GemFire_800_b48398_Windowslibtomcat-embed-jasper.jar;C:MyWorkspacePivotal_GemFire_800_b48398_Windowslibtomcat-embed-logging-juli.jar;%JAVA_HOME%libtools.jar;C:MyWorkspaceRepositoryorgspringframeworkdataspring-data-gemfire1.5.1.RELEASEspring-data-gemfire-1.5.1.RELEASE.jar;%CLASSPATH%
GEMFIRE = C:MyWorkspacePivotal_GemFire_800_b48398_Windows GF_JAVA = %JAVA_HOME%binjava.exe JAVA_HOME = C:MyWorkspaceJDK8jdk1.8.0_31 MAVEN_HOME = C:MyWorkspaceMavenapache-maven-3.3.1 PATH = %JAVA_HOME%bin;%ERACOM_HOME%;%Cryptoki%;%WAS_HOME%bin;%MAVEN_HOME%bin;C:WindowsSystem32;C:Windows;C:OtherProgramFilesnodejs;%GEMFIRE%bin;

我的简单项目文件:缓存xml文件:cache.xml

<cache>
<region name="Apps">
<region-attributes>
<cache-listener>
<class-name>mypackage.listener.TestListener</class-name>
</cache-listener>
</region-attributes>
</region>
<initializer>
<class-name>org.springframework.data.gemfire.support.SpringContextBootstrappingInitializer</class-name>
<parameter name="contextConfigLocations">
<string>spring-application-context.xml</string>
</parameter>
</initializer>
</cache>

mypackage.elistener.TestListener

public class TestListener implements CacheListener, Declarable {
@
Override
public void init(Properties arg0) {
System.out.println("Inside TestListener.init()");
}
... //Other Overridden methods . . .
}

spring-applicationcontext.xml:包含一个bean:

<?xml version="1.0" encoding="utf-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:gfe="http://www.springframework.org/schema/gemfire" xmlns:util="http://www.springframework.org/schema/util" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/gemfire http://www.springframework.org/schema/gemfire/spring-gemfire.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<bean id="myTestCacheLoader" class="mypackage.loader.MyTestCacheLoader">
</bean>
</beans>

**mypackage.loader.MyTestCacheLoader:

public class MyTestCacheLoader implements
CacheLoader, Declarable {
@
Override
public void close() {
}
@
Override
public Object load(LoaderHelper arg0) throws CacheLoaderException {
System.out.println("Inside MyTestCacheLoader.load()");
return null;
}
@
Override
public void init(Properties arg0) {
}
}

步骤:1.从目录启动gfsh-C:\MyWorkspace\Pivotal_GemFire_800_b48398_Windows

  1. 启动定位器:启动定位器--名称=定位器1--端口=10334

  2. 启动服务器:

start server --name=server1 --server-port=40411 --cache-xml-file=C:MyWorkspaceCodebaseContentServicescontent-loaderwritersrctestresourcescache-loader-writer.xml --classpath=C:MyWorkspaceCodebaseContentServicescontent-loaderwritertargetcontent-loaderwriter-0.0.1-SNAPSHOT.jar

但其抛出:java.lang.ClassNotFoundException:org.springframework.data.gemfire.support.SpringContextBootstrappingInitializer

我甚至在CLASSPATH变量中添加了gemfire jar以及上面的spring数据gemfire jar(来自我的repo)。仍然得到例外。它似乎没有解决maven依赖项/类路径。

  1. 如果我试图在gfsh启动服务器命令的类路径中提供多个jar:
start server --name=server1 --server-port=40411 --cache-xml-file="C:MyWorkspaceCodebaseContentServicescontent-loaderwritersrctestresourcescache-loader-writer.xml" --classpath="C:MyWorkspaceRepositoryorgspringframeworkdataspring-data-gemfire1.5.1.RELEASEspring-data-gemfire-1.5.1.RELEASE.jar:C:MyWorkspaceCodebaseContentServicescontent-loaderwritertargetcontent-loaderwriter-0.0.1-SNAPSHOT.jar"

我仍然得到ClassNotFoundException。它没有解析类路径中提供的jar。

有人能帮忙吗?

我认为问题只是您的类路径中有":"作为分隔符。Windows想要一个";"在这里在这种情况下,您不需要设置CLASSPATH环境变量。

然而,您很可能需要spring数据gemfire所依赖的其他jar。看起来您正在使用maven,因此这里有一种简单的方法来获取所有项目依赖项(包括可传递依赖项)的类路径。

在项目目录中,运行"mvn-DexcludeArtifactIds=gemfire-dependent:build-classpath"。这将为您提供除gemfire(自动提供)之外的所有依赖项。将您的应用程序jar添加到生成的类路径中,您应该拥有所需的一切。

此外,根据您正在做的工作,您可能会对8.1中添加到"gfsh-start"命令中的"--spring-xml location"选项感兴趣。这允许您完全省去"cache.xml",并使用spring数据gemfire提供的"gfe"命名空间在spring上下文文件中定义所有内容。

@Suparno Karmakar-不确定您是否能够解决这个问题,但在查看"启动服务器"命令的CLASSPATH(即--CLASSPATH选项的值)时,假设路径是正确的,那么需要记住的一件事是,当将--CLASSPATH选项值作为参数传递给"启动服务器"时,会将其读取到字符串中。

从那里,CLASSPATH值随后被传递并附加到最终的命令行字符串(java.exe-CLASSPATH…JVM arg),该字符串用于"分叉"GemFire服务器的JVM进程(使用java.lang.ProcessBuilder API)。

Java很可能将路径信息中的第一个正斜杠()视为"转义"字符,因此您必须像中那样转义转义字符

C:\path\to\external\file.jar

我相信Windows中的反斜杠也会起作用,因此。。。

C:/path/to/external/file.jar

@Randy May正确地指出,您可以使用"启动服务器"命令的新"--spring-xml位置"选项来指示您希望使用spring引导GemFire服务器,当然假设您使用的是GemFire8.1。

通过使用此选项,$GEMFIRE/lib中相应的Spring JARS将在启动时自动附加到服务器的CLASSPATH中(否则不使用)。

不幸的是,在将"--spring-xml location"选项与"start-server"一起使用时发现了一个错误,因为Gfsh正在查找错误版本的spring-JARS。它正在寻找弹簧核心3.2.11.RELEASE而不是3.2.12.RELEASE,SDC 1.9.0.RELEASE和SDG 1.5.1.BUILD-SNAPSHOT而不是1.5.1.RELEASE.

简单地在$GEMFIRE/lib中重命名Spring JAR就解决了这个问题。

请参阅https://svn.gemstone.com/trac/gemfire/ticket/51956,不过在GemFire 8.2的发行说明发布之前(7月),您可能无法看到此错误。

这是我的错误笔记。。。

错误标题:

GemFire Shell(Gfsh)抛出上的NoClassDefFoundError/ClassNotFoundExceptionorg/springframework/data/gemfire/support/SpringContextBootstrappingInitializer当使用Gfsh和"启动服务器…"启动GemFire服务器时。。。--GemFire 8.1 中的spring-xml location选项

错误解决方案:

当用户尝试使用带有"start server"命令通过指定"--spring-xml location"选项,GemFire 8.1(Gfsh)抛出由ClassNotFoundException引起的NoClassDefFoundError。。。{缓存服务器进程意外终止,退出状态为1。请参阅/Users/jblum/vmdev/lab/serverX中的日志文件以了解详细信息。线程"main"中出现异常java.lang.NoClassDefFoundError:org/springframework/data/gemfire/support/SpringContextBootstrappingInitializer在com.gement.gemfire.distributed.ServerLauncher.startWithSpring(ServerLauncher.java:764)在com.gement.gemfire.distributed.ServerLauncher.start(ServerLauncher.java:696)在com.gement.gemfire.distributed.ServerLauncher.run(ServerLauncher.java:626)在com.gement.gemfire.distributed.ServerLauncher.main(ServerLauncher.java:200)引起原因:java.lang.ClassNotFoundException:org.springframework.data.gemfire.support.SpringContextBootstrappingInitializer位于java.net.URLClassLoader$1.run(URLClassLoader.java:366)java.net.URLClassLoader$1.run(URLClassLoader.java:355)位于的java.security.AccessController.doPrivileged(本机方法)java.net.URLClassLoader.findClass(URLClassLoader.java:354)java.lang.ClassLoader.loadClass(ClassLoader.java:425)sun.mic.Launcher$AppClassLoader.loadClass(Launcher.java:308)java.lang.ClassLoader.loadClass(ClassLoader.java:358)…4 more}}GemFire错误地将Spring LIBS指定为版本3.2.11.RELEASE当GemFire实际上与Spring一起发货时3.2.12.RELEASE JAR文件。此外,Spring Data Commons JAR文件是错误地标识为spring-data-commons-1.9.0.RELEASE.jar,但是,GemFire 8.1随附spring-data-commons-1.91.RELEASE.jar。请注意,8.1中的GemFire/Gfsh正在正确地指定Spring Data GemFire JAR文件spring-data-germire1.5.1.RELEASE.jar请参阅Bugnote解决方法解决这个问题。

错误解决方案:

有两种方法可以解决此问题:1。首先,尝试和经过测试的程序是…1.1下载并复制Spring3.2.11.将JAR文件释放到$GEMFIRE/lib目录中。对于$GEMFIRE/lib中的每个Spring 3.2.12.RELEASE JAR文件,复制相应的3.2.11.将JAR释放到$GEMFIRE/lib中。1.2接下来,下载spring-data-commons-1.9.0.RELEASE.jar文件并将其复制到$GEMFIRE/lib中。1.3最后,执行以下操作…$cp$GEMFIRE/lib/spring-data-gemfire1.5.1.RELEASE.jar$GEMFIRE/lib/spring-data-gemfire1.5.1.BUILD-SNAPSHOT.jar——注意:不幸的是,Gfsh正在寻找错误版本的这些特定的Spring JAR文件。---2.另一种选择是使用"--classpath"选项。注,在GemFire中8.1中,"--classpath"选项已更改为"prepend"选项,因此,有效地覆盖了$GEMFIRE/lib目录。注意,但是当覆盖任何GemFire lib依赖项。注意,此"准备就绪"为了安全起见,行为不适用于"gemfire.jar"文件本身原因。

希望这能有所帮助!如果你仍然有问题,请回复。

干杯!

请将分隔符":"替换为"\;"您需要在窗口分隔符之前添加转义符。否则,gfsh将把";"视为一个命令的结束。

最新更新