【问题标题】:Worklight adapters, Java ClasspathWorklight 适配器、Java 类路径
【发布时间】:2014-04-17 11:31:33
【问题描述】:

简单的问题是:如何使 Java 资源包可用于从 Worklight 适配器访问的 Java JAR 中的代码?我认为这相当于:Java 在 Worklight 适配器下使用的类路径是什么?

原因:我们使用与特定企业服务通信的第三方 Java 库,它有自己的配置机制来确定该服务的位置,该机制使用资源包。

我们将库 JAR 放在 server/lib 文件夹中,并且可以成功地从适配器调用库代码:

    manager = com.third.party.manager.getInstance();
    // manager is correctly obtained
    token = manager.talkToServer();
    // this fails with an error indicating that the server location is unknown

我们看到第三方代码尝试完全使用这种模式,特别是 getBundle() 的三个变体如下所示:

java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("ThirdParty");
Enumeration<String> enumeration = bundle.getKeys();

while (enumeration.hasMoreElements()){
 String str = enumeration.nextElement();
 System.out.println("property " + str);
     //etc

现在,我希望将我的资源包打包到一个新的 JAR 文件的基础中,并将其添加到 server/lib 中并获取它。我创建了该资源 JAR 文件,其中包含

ThirdParty.properties

作为测试,创建了一个包含上述代码的小型 Java 应用程序,并将资源 JAR 添加到该应用程序的类路径中;我们按预期加载的包。

然后我将该 Java 转换为适配器代码:

var bundle = java.util.ResourceBundle.getBundle("ThirdParty");

var enumeration = bundle.getKeys();

while (enumeration.hasMoreElements())
{
  var str = enumeration.nextElement();  
  var val = bundle.getString(str);    
}

将我的属性 JAR 文件添加到 server/lib 并得到一个异常,告诉我找不到捆绑包。

关于更好的类路径的建议?

【问题讨论】:

    标签: ibm-mobilefirst worklight-adapters


    【解决方案1】:

    我刚刚尝试过,一切正常。我尝试重现问题的步骤:

    1. 使用 WL Studio 6.1 创建了新的 WL 项目
    2. 添加了具有单个 name=anton 属性的 props.properties 文件
    3. 在 Eclipse 中右键单击它,导出 -> Java -> JAR 文件。我选中的唯一复选框是导出生成的类文件和资源。我已将文件命名为 resources.jar
    4. 已删除 props.properties 并将 resources.jar 复制到 server/lib 文件夹
    5. 创建适配器,添加以下过程

      function test(){
          return {
               data: com.anton.PropGetter.getProp("name")
          };
      }
      
    6. 使用以下代码在 com.anton 包下创建 PropGetter.java

      package com.anton;
      
      import java.util.ResourceBundle;
      
      public class PropGetter {
          public static String getProp(String propName){
              ResourceBundle bundle = ResourceBundle.getBundle("props");
              return propName + " :: " + bundle.getString(propName);
          }
      }
      
    7. 经过测试的适配器程序,得到以下输出:

      {
         "data": "name :: anton",
         "isSuccessful": true
      }
      

    【讨论】:

    • 谢谢,确实有效。它与我最初的情况略有不同,相当于 PropGetter 被打包在一个 JAR 中,但我也这样做了,它仍然可以正常工作。第三方案例坚决失败,我从 javascript 直接调用 ResourceBundle 也是如此。我会继续挖掘,至少这个答案证实了资源加载的一般情况符合预期。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多