为什么在通过 xml 文件加载 Geode bean 时尝试获取 Gemfire class?
Why trying to get Gemfire class when loading Geode beans through xml file?
今天我正在尝试使用 spring 来初始化一些 Geode 组件。我创建的 xml 如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:gfe="http://www.springframework.org/schema/gemfire"
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">
<beans>
<gfe:client-cache id="my-cache" pool-name="my-pool"/>
<gfe:pool id="my-pool" subscription-enabled="true">
<gfe:locator host="max" port="10334"/>
</gfe:pool>
</beans>
</beans>
我只是想获取 Geode 的客户端缓存。当我 运行 下面的代码时:
public class GeodeLauncher {
public static void main(String[] args){
ApplicationContext ac = new FileSystemXmlApplicationContext("classpath:geodeConfig.xml");
ac.getBean("my-cache");
}
}
异常抛出:
Caused by: java.lang.ClassNotFoundException: com.gemstone.gemfire.distributed.DistributedSystem
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)
... 31 more
我在 pom.xml
中添加了依赖项
<dependency>
<groupId>org.apache.geode</groupId>
<artifactId>geode-core</artifactId>
<version>1.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-gemfire -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-geode</artifactId>
<version>1.0.0.APACHE-GEODE-INCUBATING-M2</version>
</dependency>
我注意到包 org.apache.geode.distributed 下有一个名为 DistributedSystem 的同名 class。
这个 class 应该被使用吗?为什么需要 com.gemstone.gemfire.distributed.DistributedSystem?我是不是配置错了xml?
是的,您遇到了一些版本问题。
首先,Spring Data Geode 1.0.0.INCUBATING-RELEASE
也是 available (see release announcement),因此您应该将应用程序依赖项更新为...
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-geode</artifactId>
<version>1.0.0.INCUBATING-RELEASE</version>
</dependency>
其次,目前还没有正式基于最新版本的 Apache Geode(即 1.1.0)的 Spring Data Geode 版本。从技术上讲,SD Geode 1.0.0.INCUBATING-RELEASE 在 Apache Geode 1.0.0-incubating(Geode 1.1.0 之前的 GA 版本)上 based。我计划很快 Spring Data Geode 1.1.0.RELEASE
,它将基于 Apache Geode 1.1.0.
然而,虽然我没有正式支持它,但我认为可以更新 SDG 1.0。0.INCUBATING-RELEASE 以使用 Apache Geode 1.1.0,SDG 将 运行 就好了与 Apache Geode 1.1.0 以及。
为此,只需在您的应用程序 POM 中声明以下依赖项(至少在 SDG 1.1.0.RELEASE 发布之前 ;-)...
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-geode</artifactId>
<version>1.0.0.INCUBATING-RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.apache.geode</groupId>
<artifact>geode-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.geode</groupId>
<artifact>geode-cq</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.geode</groupId>
<artifact>geode-wan</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.geode</groupId>
<artifactId>geode-core</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.geode</groupId>
<artifactId>geode-cq</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.geode</groupId>
<artifactId>geode-wan</artifactId>
<version>1.1.0</version>
</dependency>
在 Apache Geode 1.0.0 孵化(即里程碑版本)之前,Geode 类 的包命名空间仍然植根于 com.gemstone.gemfire
(因为 Apache Geode 源自 Pivotal GemFire)。
但是,从 Apache Geode 1.0.0-incubating 及更高版本(即 1.1.0)开始,包命名空间更改为 org.apache.geode
。因此,您需要兼容的 Spring Data Geode 版本,目前为 1.0.0.INCUBATING-RELEASE
.
另请注意,Spring XML 配置文件中的额外嵌套 <beans>
标记是不必要的;您的 XML 配置可以是...
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:gfe="http://www.springframework.org/schema/gemfire"
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">
<gfe:client-cache id="my-cache" pool-name="my-pool"/>
<gfe:pool id="my-pool" subscription-enabled="true">
<gfe:locator host="max" port="10334"/>
</gfe:pool>
</beans>
此外,在Spring中有一个普遍的运动,从XML移开。
从 Spring Data Geode 1.0.0.APACHE-GEODE-INCUBATING-M3 开始,目前是 1.0.0.INCUBATING-RELEASE,您可以使用新的注释模型(主要受 [=101= 启发)在 Java 中执行等效的 Spring XML 配置] 开机), 像这样...
import ...;
@SpringBootApplication
@ClientCacheApplication(locators = { @ClientCacheApplication.Locator(host="max") }
class GeodeLauncher {
@Autowired
private ClientCache geodeClientCache;
public static void main(String[] args) {
SpringApplication.run(GeodeLauncher.class, args);
}
}
最后一点,如果您处于真正的前沿,您可以随时使用 Spring Data Geode 1.1 的构建快照。0.BUILD-SNAPSHOT, available 在 Spring 的 libs-snapshot
Maven 存储库中。您只需要将适当的存储库声明添加到您的应用程序 POM 文件中...
<repository>
<id>spring-libs-snapshot</id>
<url>https://repo.spring.io/libs-snapshot</url>
</repository>
Spring Data Geode 1.1.0.BUILD-SNAPSHOT
是 based on Apache Geode 1.1.0.
然后,您的依赖声明就变成了...
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-geode</artifactId>
<version>1.1.0.BUILD-SNAPSHOT</version>
</dependency>
没有所有排除业务和对 Apache Geode 1.1.0 工件的显式依赖。另一件好事是 SDG 1.1.0 包括对 Geode 的 Lucene 集成的支持。
无论如何,希望这对您有所帮助。您总是可以在我的 SDG 参考实现 (RI) GitHub 项目中看到更多不同配置样式的示例...
比较Spring XML config (then here) to Geode cache.xml
, then Spring XML to Spring JavaConfig to using the new Annotation configuration model (and of course, the client-side using Annotations)等的例子很多
干杯,
约翰
今天我正在尝试使用 spring 来初始化一些 Geode 组件。我创建的 xml 如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:gfe="http://www.springframework.org/schema/gemfire"
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">
<beans>
<gfe:client-cache id="my-cache" pool-name="my-pool"/>
<gfe:pool id="my-pool" subscription-enabled="true">
<gfe:locator host="max" port="10334"/>
</gfe:pool>
</beans>
</beans>
我只是想获取 Geode 的客户端缓存。当我 运行 下面的代码时:
public class GeodeLauncher {
public static void main(String[] args){
ApplicationContext ac = new FileSystemXmlApplicationContext("classpath:geodeConfig.xml");
ac.getBean("my-cache");
}
}
异常抛出:
Caused by: java.lang.ClassNotFoundException: com.gemstone.gemfire.distributed.DistributedSystem
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)
... 31 more
我在 pom.xml
中添加了依赖项 <dependency>
<groupId>org.apache.geode</groupId>
<artifactId>geode-core</artifactId>
<version>1.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-gemfire -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-geode</artifactId>
<version>1.0.0.APACHE-GEODE-INCUBATING-M2</version>
</dependency>
我注意到包 org.apache.geode.distributed 下有一个名为 DistributedSystem 的同名 class。
是的,您遇到了一些版本问题。
首先,Spring Data Geode 1.0.0.INCUBATING-RELEASE
也是 available (see release announcement),因此您应该将应用程序依赖项更新为...
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-geode</artifactId>
<version>1.0.0.INCUBATING-RELEASE</version>
</dependency>
其次,目前还没有正式基于最新版本的 Apache Geode(即 1.1.0)的 Spring Data Geode 版本。从技术上讲,SD Geode 1.0.0.INCUBATING-RELEASE 在 Apache Geode 1.0.0-incubating(Geode 1.1.0 之前的 GA 版本)上 based。我计划很快 Spring Data Geode 1.1.0.RELEASE
,它将基于 Apache Geode 1.1.0.
然而,虽然我没有正式支持它,但我认为可以更新 SDG 1.0。0.INCUBATING-RELEASE 以使用 Apache Geode 1.1.0,SDG 将 运行 就好了与 Apache Geode 1.1.0 以及。
为此,只需在您的应用程序 POM 中声明以下依赖项(至少在 SDG 1.1.0.RELEASE 发布之前 ;-)...
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-geode</artifactId>
<version>1.0.0.INCUBATING-RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.apache.geode</groupId>
<artifact>geode-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.geode</groupId>
<artifact>geode-cq</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.geode</groupId>
<artifact>geode-wan</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.geode</groupId>
<artifactId>geode-core</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.geode</groupId>
<artifactId>geode-cq</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.geode</groupId>
<artifactId>geode-wan</artifactId>
<version>1.1.0</version>
</dependency>
在 Apache Geode 1.0.0 孵化(即里程碑版本)之前,Geode 类 的包命名空间仍然植根于 com.gemstone.gemfire
(因为 Apache Geode 源自 Pivotal GemFire)。
但是,从 Apache Geode 1.0.0-incubating 及更高版本(即 1.1.0)开始,包命名空间更改为 org.apache.geode
。因此,您需要兼容的 Spring Data Geode 版本,目前为 1.0.0.INCUBATING-RELEASE
.
另请注意,Spring XML 配置文件中的额外嵌套 <beans>
标记是不必要的;您的 XML 配置可以是...
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:gfe="http://www.springframework.org/schema/gemfire"
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">
<gfe:client-cache id="my-cache" pool-name="my-pool"/>
<gfe:pool id="my-pool" subscription-enabled="true">
<gfe:locator host="max" port="10334"/>
</gfe:pool>
</beans>
此外,在Spring中有一个普遍的运动,从XML移开。
从 Spring Data Geode 1.0.0.APACHE-GEODE-INCUBATING-M3 开始,目前是 1.0.0.INCUBATING-RELEASE,您可以使用新的注释模型(主要受 [=101= 启发)在 Java 中执行等效的 Spring XML 配置] 开机), 像这样...
import ...;
@SpringBootApplication
@ClientCacheApplication(locators = { @ClientCacheApplication.Locator(host="max") }
class GeodeLauncher {
@Autowired
private ClientCache geodeClientCache;
public static void main(String[] args) {
SpringApplication.run(GeodeLauncher.class, args);
}
}
最后一点,如果您处于真正的前沿,您可以随时使用 Spring Data Geode 1.1 的构建快照。0.BUILD-SNAPSHOT, available 在 Spring 的 libs-snapshot
Maven 存储库中。您只需要将适当的存储库声明添加到您的应用程序 POM 文件中...
<repository>
<id>spring-libs-snapshot</id>
<url>https://repo.spring.io/libs-snapshot</url>
</repository>
Spring Data Geode 1.1.0.BUILD-SNAPSHOT
是 based on Apache Geode 1.1.0.
然后,您的依赖声明就变成了...
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-geode</artifactId>
<version>1.1.0.BUILD-SNAPSHOT</version>
</dependency>
没有所有排除业务和对 Apache Geode 1.1.0 工件的显式依赖。另一件好事是 SDG 1.1.0 包括对 Geode 的 Lucene 集成的支持。
无论如何,希望这对您有所帮助。您总是可以在我的 SDG 参考实现 (RI) GitHub 项目中看到更多不同配置样式的示例...
比较Spring XML config (then here) to Geode cache.xml
, then Spring XML to Spring JavaConfig to using the new Annotation configuration model (and of course, the client-side using Annotations)等的例子很多
干杯, 约翰