如何获得glassfish / javaee应用程序版本?

时间:2016-04-20 09:34:10

标签: java-ee glassfish

美好的一天。 我用版本部署一些测试应用程序,如 https://community.oracle.com/blogs/serli/2010/08/30/how-use-glassfish-application-versioning

$ asadmin deploy --name = test:BETA-1.1 test.war

但是当我尝试获取应用程序名称时 http://javahowto.blogspot.ru/2009/12/how-to-get-module-name-and-app-name.html

initialContext.lookup(“java:app / AppName”) - 它没有版本返回。 是否可以通过程序获得应用程序的版本?

$ asadmin list-applications 使用版本

打印应用程序名称

1 个答案:

答案 0 :(得分:0)

我在源代码中找到了一个获得AppName的地方:

glassfish3 \的glassfish \模块\容器common.jar!COM /太阳/企业/容器/普通/ IMPL /的 JavaModuleNamingProxy 的.class

  private String getAppName() throws NamingException {
    ComponentEnvManager namingMgr = (ComponentEnvManager)this.habitat.getComponent(ComponentEnvManager.class);

    String appName = null;
    if (namingMgr != null) {
      JndiNameEnvironment env = namingMgr.getCurrentJndiNameEnvironment();

      BundleDescriptor bd = null;
      if ((env instanceof EjbDescriptor)) {
        bd = ((EjbDescriptor)env).getEjbBundleDescriptor();
      } else if ((env instanceof BundleDescriptor)) {
        bd = (BundleDescriptor)env;
      }
      if (bd != null) {
        Application app = bd.getApplication();
        appName = app.getAppName();  // <-- HERE!
      }
    }
    if (appName == null)
      throw new NamingException("Could not resolve java:app/AppName");

    return appName;
  }

和Application.getAppName()在createApplication

中设置

glassfish3 \ GlassFish的\模块\ dol.jar!COM /阳光/企业/部署/的应用的.class

  public static Application createApplication(Habitat habitat, String name, ModuleDescriptor < BundleDescriptor > newModule) {
    Application application = new Application(habitat);
    application.setVirtual(true);
    if ((name == null) && (newModule.getDescriptor() != null)) {
      name = ((BundleDescriptor)newModule.getDescriptor()).getDisplayName();
    }
    String untaggedName = VersioningUtils.getUntaggedName(name);
    if (name != null) {
      application.setDisplayName(untaggedName);
      application.setName(untaggedName);
      application.setAppName(untaggedName);
    }
    newModule.setStandalone(true);
    newModule.setArchiveUri(untaggedName);
    if (newModule.getDescriptor() != null) {
      ((BundleDescriptor)newModule.getDescriptor()).setApplication(application);
    }
    application.addModule(newModule);
    return application;
  }

正如您所看到的,它不会在应用程序中保存标记的名称。为什么不使用displayName? 不过,我会尝试找另一种获取版本信息的方法......可以设置/读取glassfish-application.xml / version-identifier

更新: glassfish在(domain | node)/ applications / appName~version中创建版本的文件夹。所以我们可以分析一些资源路径:)

static final Pattern APP_VER = Pattern.compile("/applications/([^~/]+)(?:~([^/]*))?");

public String getAppVersion() {
  URL res = getClass().getResource("/META-INF/somefile.xml");
  if (res != null) {
    Matcher ver = APP_VER.matcher(res.getPath());
    if (ver.find())
      return ver.group(2);
  }

  return null;
}

玩得开心!也许有人有更美丽的解决方案?