【问题标题】:WAR file can't be deployed on Tomcat 7 without wtpwebapps folderWAR 文件无法在没有 wtpwebapps 文件夹的 Tomcat 7 上部署
【发布时间】:2017-09-02 22:09:39
【问题描述】:

我在 Tomcat 服务器上部署 War 文件时遇到了问题。 我的Tomcat Server配置如下:

我的部署步骤:

  1. 我在 Eclipse Kepler 中创建了一个 WAR 文件(Windows 7 64 位,未使用 Maven)。
  2. 使用 Tomcat Web 应用程序管理器上传。
  3. 点击部署。

Tomcat 在 tomcat/webapps 中解压 WAR 文件并抛出 NullPointerException。它缺少一些应该导入到项目中才能正常工作的文件。

当我在 Eclipse 中工作时,作为这些文件的源,我在服务器设置中给出了一个工作区路径,并添加了 Eclipse 默认提供的 wtpwebapps 文件夹。所以我的完整路径如下所示:

C:\Users\myUserName\kepler\workspace.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\myProjectName\WEB-INF\classes\project\fdsProject\FDS.prj

现在,当我部署项目时,它位于 webapps 文件夹中,而不是 wtpwebapps 中,如果我尝试在浏览器中启动,它会显示 NullPointerException。但是只要我将 wtpwebapps 文件夹从我的工作区复制到 webapps 附近的 tomcat 安装文件夹,我的项目就会成功启动。

这意味着我不能在另一台服务器上启动我的项目,只能部署一个独立的 WAR 文件。我必须手动将带有我的项目的 wtpwebapps 添加到 tomcat 服务器安装文件夹中。如何优化它并仅使用部署的 WAR 文件启动项目? 谢谢!

编辑

我的项目结构如下所示:

【问题讨论】:

  • 感谢您的评论,但我发布了我的服务器配置的屏幕截图,此问题中没有显示代码
  • 什么是 NPE 堆栈跟踪?您是如何引用这些文件的?
  • 使用绝对路径,从catalina base开始:private static String data_path = new File(System.getProperty("catalina.base")).getAbsolutePath()+"\\webapps\\myProjectName\\WEB-INF\\classes\\project\\fdsProject\\"等。
  • 你的问题就在那里。
  • new File(System.getProperty("catalina.base")).getAbsolutePath() 给出了 tomcat 安装文件夹的路径,webapps 和我的 WAR 文件所在的位置与我的计算机设置无关。究竟哪里有问题?

标签: java eclipse jsp tomcat jakarta-ee


【解决方案1】:
  1. 停止 Tomcat 服务器

  2. 在设置视图Tomcat Server settings in Eclipse -> Server Locations,勾选Use Tomcat Installation(...)

  3. 现在,你可以更改Deploy Path,如果你想要webapps,然后输入它。

编辑

下面的值控制tomcat如何处理war文件

autoDeploy="true"
unpackWARs="true"

只需在您的 server.xml 文件中搜索这些值并根据需要编辑值。

【讨论】:

  • 添加新的服务器设置后,在我的项目附近出现了一个新的项目“服务器”。我需要以某种方式将它包含到我的项目的 WAR 文件中吗?
  • 编辑保存服务器后,您可以使用Run on Server ...上下文菜单来使用它
  • 我按照你说的试过了。结果:1)当我在 Eclipse 中“在服务器上运行”时,eclipse 在 tomcat/webapps 中使用我的项目名称创建了一个新文件夹 2)我从项目中创建了 WAR 文件并将其部署在 Tomcat 上。 3) Tomcat 在我的项目文件夹附近的 tomcat/webapps 中创建了一个基于 WAR 的新文件夹,我可以运行新添加的 WAR 应用程序。 4)之后我决定在另一台机器上测试它。我将项目文件夹复制到一个新位置并部署了 war 文件。所以我有与第一台机器上相同的文件。它没有用!如果不添加项目文件夹,它也不能正常工作
  • Tomcat默认工作模式总是将war解压到名为war文件的目录
  • 是的,在我的情况下也是如此。在 tomcat/webapps 我有“myProjectName”,它是在我在服务器上运行我的项目后生成的,WAR 文件说“test.war”和一个文件夹 test。但是战争文件的名称和我的项目的名称不同。我认为这没有多大意义。所以我现在很困惑,如何在另一台机器上运行它,它只需要一个 WAR 文件就可以工作。
【解决方案2】:

如果您希望能够将您的应用程序部署为 WAR 文件,您需要引用其中相对于应用程序本身的所有内容,而不是绝对文件路径,如果可以的话,甚至不作为文件路径。如果您的代码需要java.io.File,请重写它。关键是你不关心在哪里 东西,你只关心如何获得它们的内容。对于 Servlet,您可以通过在正确的类或类加载器上调用 getResourceAsStream() 来读取 Web 应用的类路径中的任何内容。

getResourceAsStream() vs FileInputStream

【讨论】:

  • 谢谢你的问题,你离开了我。我已经阅读了它们并尝试现在构建我的路径。但似乎我做错了什么,因为我得到了 null 结果。我编辑了我的问题并将我的项目结构放在这里。我正在尝试访问 fdsProject 文件夹,以将其路径作为字符串并将其提交给下一个变量。我正在做的是:InputStream path = CBREngine.class.getClassLoader().getResourceAsStream("src/project/fdsProject/FDS.prj"); 之后我需要将 InputStream 转换为字符串。
  • src 作为 Java 构建路径上的条目,它成为运行时 CLASSPATH 上的条目,因此您不要将它用作相对引用的一部分。不过,你走在正确的轨道上。使用 Reader 将 InputStream 解码为文本。
  • 很高兴听到这个消息。我自定义了我的代码并尝试将其转换为您编写的文本,但我看到的只是不可读的符号。我可能遗漏了一些东西......我的代码看起来像这样:InputStream path = CBREngine.class.getClassLoader().getResourceAsStream("/project/fdsProject/FDS.prj");Reader reader = new InputStreamReader(path); BufferedReader br = new BufferedReader(reader); String dataPath = null; while ((dataPath=br.readLine())!=null) { System.out.println("Data path: " +dataPath); }
  • 听起来像是文件编码问题,或者文件不包含您认为的内容。可能是时候提出一个新问题了。
  • 我实际上只需要该文件的路径作为字符串,而不是打开文件。如果我提供正确的路径,这将在下一步中完成。我给 getResourceAsStream() 函数的参数是否正确?也许项目文件夹之前的第一个斜杠是不必要的?
猜你喜欢
  • 1970-01-01
  • 2014-02-01
  • 2012-09-28
  • 2010-09-13
  • 2012-07-29
  • 2017-04-04
  • 2011-06-04
  • 2011-07-03
相关资源
最近更新 更多