为什么在通过 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, availableSpring 的 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-SNAPSHOTbased 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 项目中看到更多不同配置样式的示例...

https://github.com/jxblum/contacts-application/tree/apache-geode/configuration-example/src/main/java/example/app

比较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)等的例子很多

干杯, 约翰