使用eclipse wtp将web项目发布到tomcat后缺少类

Yon*_*man 9 eclipse deployment tomcat eclipse-wtp

我的工作区中有几个动态Web项目,每个项目都包含类,并引用其他实用程序项目(简单Java项目)和第三方jar.

这些应用程序(动态Web项目)使用eclipse WTP(Helios 3.6)部署在tomcat v6.0.6上

当我更新我的工作区并从SVN存储库中提取新的类/资源/ jar时,我在tomcat应用程序中重新发布我的应用程序,然后重新启动它.

有时,当tomcat启动我的某个应用程序时,它会抛出ClassNotFoundException,或者抱怨其他缺少的资源.有时我发现部署的资源(例如spring beans xml)不是最新的,并且其中包含"旧"内容.

我使用的常见反巫术黑魔法处理:*停止/启动tomcat*clean(右键单击服务器配置)*清除tomcat工作目录*从tomcat删除所有应用程序,清理,重启tomcat,添加所有应用程序

我需要多次运行这个'程序',直到问题解决.

你们也受苦了吗?这是一个已知的错误 ?有任何建议如何解决它?使用jar而不是实用项目会解决/减少这个问题吗?

我会考虑使用Embedded Jetty,我只想避免在"生产"环境中运行Jetty的专有脚本.

- Yonatan

Era*_*rel 3

这种事在我身上发生过很多次。我不会称其为巫毒。我认为当您在后台更改内容(例如 Maven 构建)时,Eclipse WTP 无法正常工作。

我为解决这个问题所做的就是完全避免使用它。相反,我使用 Maven WAR 插件来部署应用程序:

mvn war:inplace tomcat:inplace -DskipTests=true
Run Code Online (Sandbox Code Playgroud)

这工作得非常快,因为它不需要组装和打包战争。

然后取消部署应用程序:

mvn tomcat:undeploy
Run Code Online (Sandbox Code Playgroud)

我有这样的脚本

  • 部署并启动 tomac
  • 取消部署并停止tomcat

它看起来像这样:

启动tomcat并部署应用程序:

#!/bin/sh

if [ -f $CATALINA_PID ]; then
  echo "tomcat already running with pid " `cat $CATALINA_PID`
  exit 1
fi

java -Dmy.arg=val -Dcatalina.home=<catalina-home> -Dlog4j.configuration=file:///log4j.xml -classpath <path-to-tomcat-lib>/bootstrap.jar:/usr/lib/jvm/java-6-sun-1.6.0.20/lib/tools.jar org.apache.catalina.startup.Bootstrap start &

echo $! > $CATALINA_PID

mvn war:inplace tomcat:inplace -DskipTests=true
Run Code Online (Sandbox Code Playgroud)

取消部署并停止 tomcat:

#!/bin/sh

mvn tomcat:undeploy

<path-to-tomcat>/shutdown.sh -force

rm $CATALINA_PID
Run Code Online (Sandbox Code Playgroud)

可能与任何其他构建脚本相同 - 这只是您需要编写多少代码的问题。

我选择 Maven 的 war:inplace 目标是因为它做的事情很少,因此运行得很快。请参阅此处:maven.apache.org/plugins/maven-war-plugin/usage.html

顺便说一句,ANT 和 Gradle 有一个战争任务/插件,可以配置它来做类似的事情(我真的不记得了......)

希望这可以帮助。