7

所以下面的问题:我们有一个负载均衡器,后面有 n 个服务器。在每台服务器上,ear 中都安装了一个 PDF 项目(war)以及同一个 earfile 中的 pdf-builder 项目(不同的 war)。我现在想阅读另一场战争的 pdf。

问题是:我不知道我正在运行的服务器的 IP 地址,并且使用 dns 查找我可能会通过负载平衡器在不同的服务器上结束。此外,访问/安全约束可能存在问题,因为服务器本身不是有权访问 pdf war 项目的 pdf 文件位置的有效用户。

有没有办法获得像 getResourceAsStream() 这样的东西,它可以在耳朵内的不同模块/战争文件中工作?

4

5 回答 5

5

您可以将 .PDF 移至单独的 jar(即 pdf-builder.jar)并将其放入 .EAR 在您的 .WAR ( META-INF/MANIFEST.MF) 清单中放入以下行:

Class-Path: pdf-builder.jar

现在您可以使用类加载器加载 .PDF。这是符合 J2EE 的。

于 2012-05-25T09:32:30.443 回答
3

您需要提供文件的绝对路径才能访问不在当前类路径中的资源。

你可以打电话

serverletContext.getRealpath("/");
将给出直到服务器节点(上下文)的路径。从那里您可以导航到该文件。

另一种方法是,Jboss 在引导时使用(或设置)几个环境变量。您可以使用这些属性来获取当前节点(如“默认”)。以下两个属性将为您提供当前服务器节点的绝对路径。

System.getProperty("jboss.server.base.dir") + File.separator + System.getProperty("jboss.server.name");
System.getenv('varname')如果 getProperty 不起作用,请使用)。从那里您可以导航。 是 jboss 使用的系统变量的完整列表。

于 2012-05-24T10:40:41.237 回答
3

WAR 旨在相互隔离。他们可以“向上”查看应用程序类加载器(EAR 级别),但无法访问对等的类加载器。因此,虽然可能有办法让它在您的特定应用程序服务器上工作,但不建议这样做。如果运营团队中的某个人更改了部署选项,他们可能不知道您正在依赖该机制,并且会以一种(可能)神秘的方式破坏应用程序。

尝试访问这样的对等类加载器违反了 Java EE(如果不是规范的文字,至少是它的精神)。

如果您不能将静态内容放在单独的服务器上进行访问,至少将静态 PDF 放入 JAR(如其他人建议的那样)并部署到 EAR 中。当你这样做时,不要忘记将 JAR 条目添加到声明 WAR 的清单文件中(否则它不会将 JAR 加载到应用程序类加载器中)。

于 2012-05-24T14:23:36.167 回答
2
  1. 如果部署不是太频繁,请将其更改.war.jar( ?)。.ear例如,如果您每天重新启动,则在服务器 lib 目录中。

  2. 不要部署战争,而是将文件上传到固定目录,即使用rsync这有我的偏好。

  3. 按照@Rp- 说的做,可能会解压缩。

于 2012-05-24T10:58:28.830 回答
0

我知道我没有足够的经验来回答这样的问题,所以,在一个非常非常粗略的草图中,我所能想到的就是将每个 .war 设置为不同的 Spring 上下文,然后通过在内部设置适当的映射来动态加载它弹簧 MVC 框架。

在运行时动态加载 Spring 上下文

将 Spring 资源加载为依赖 jar

Web 资源 - 第 9 章 - Spring 参考

于 2012-05-24T23:44:12.953 回答