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

jfgube3f  于 2023-10-18  发布在  Eclipse
关注(0)|答案(8)|浏览(145)

在我的工作区中有几个动态Web项目,每个项目都包含类,并引用其他实用程序项目(简单的Java项目)和第三方jar。
这些应用程序(动态Web项目)使用eclipse WTP(Helios 3.6)部署在tomcat v6.0.6上
当我更新我的工作区,并从SVN存储库中提取新的类/资源/jar时,我在tomcat应用程序中重新发布我的应用程序,并重新启动它。
偶尔,当tomcat启动我的一个应用程序时,它会抛出ClassNotFoundException,或者抱怨缺少其他资源。有时候我会看到一个部署的资源(例如spring beans xml)不是最新的,里面有“旧”的内容。
我常用的抗巫-黑-魔疗法:用途:* 停止/启动tomcat * 清理(当右键单击服务器配置时)* 清理tomcat工作目录 * 从tomcat中删除所有应用,清理,重新启动tomcat,添加所有应用
我需要运行这个“程序”几次,直到问题得到解决。
你们也有这种病吗?这是一个已知的bug吗?有什么建议吗?使用jar而不是实用程序项目是否可以解决/减少这个问题?
我会考虑使用嵌入式Jetty代替,我只是想避免专有的脚本运行Jetty的'生产'环境。
-- Yonatan

gjmwrych

gjmwrych1#

我也遇到过类似的问题。当我发布一个Web应用程序时,Eclipse没有包含一个jar,因此通过Eclipse发布到服务器失败。我通过修改项目的.classpath文件来纠正依赖关系,如下所示。确保它与其他jar配置同步。

<classpathentry kind="var" path="M2_REPO/log4j/log4j/1.2.17/log4j-1.2.17.jar" sourcepath="M2_REPO/log4j/log4j/1.2.17/log4j-1.2.17-sources.jar">
            <attributes>
            <attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
        </attributes>
        </classpathentry>
xmq68pz9

xmq68pz92#

似乎在解决这个问题上正在取得进展。
https://bugs.eclipse.org/bugs/show_bug.cgi?id=365748
希望它能在Eclipse的下一个版本中得到修复。

r8xiu3jd

r8xiu3jd3#

一个可能的解决方案可能是您的bin文件夹没有被创建。检查你没有删除build/bin文件夹,它确实存在于你的工作空间。

deikduxw

deikduxw4#

TL;DR在eclipse中刷新Package Explorer视图并发布(或重新发布)服务。

这个问题通常发生在文件是在eclipse/wtp环境之外创建的时候。例如,maven构建过程可能会在target文件夹下生成..$1.class文件。eclipse/wtp在发布时会忽略它们,因为它不知道它们的存在。通过刷新Package Explorer视图重新构建eclipse的文件索引有助于eclipse拾取这些更改。
这似乎是eclipse/wtp在IDE外部创建文件时的一个限制。

mtb9vblg

mtb9vblg5#

我经常遇到这种事。我可不认为那是巫毒教。我认为当你在后台改变一些东西时,Eclipse WTP不能很好地工作(例如,一个专业的建筑)。
为了解决这个问题,我所做的就是完全避免使用它。相反,我使用Maven WAR插件来部署应用程序:

mvn war:inplace tomcat:inplace -DskipTests=true

这工作非常快,因为它不需要组装,并 Package 战争。
然后要取消部署应用程序:

mvn tomcat:undeploy

我有剧本

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

它看起来像这样:
启动tomcat并部署app:

#!/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

取消部署并停止tomcat:

#!/bin/sh

mvn tomcat:undeploy

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

rm $CATALINA_PID

可能与任何其他构建脚本相同-这只是你必须编写多少代码的问题。
我选择了Maven的战争:原地目标是因为它做得很少,因此运行得很快。点击这里:maven.apache.org/plugins/maven-war-plugin/usage.html
顺便说一句,ANT和Gradle有一个战争任务/插件,可能可以配置为做类似的事情(我真的不记得了.)
希望这对你有帮助。

oxf4rvwz

oxf4rvwz6#

另一件需要注意的事情是,应该启用Project -> Build Automatically,并且项目不应该有任何构建路径问题。
打开navigator视图并确认构建文件夹已生成class文件。
如果文件没有被构建,它们将不会被发布。虽然这看起来很明显,但很容易看过,浪费了我很多时间。

w3nuxt5m

w3nuxt5m7#

有趣的行为....由于权限问题,我的Linux机器上也发生了类似的事情。
我建议不要使用WTP。尝试使用ant build script。它很简单,对我来说,它工作得很好。

0dxa2lsx

0dxa2lsx8#

自从Eclipse问世以来,这些问题一直存在。到达这里是因为atm my web.xml不再被部署。特别是与m2eclipse结合使用时,您永远不会知道当您尝试启动Tomcat时会发生什么。我认识的每个使用Eclipse的人都有这些问题,我不明白为什么他们没有得到解决.不幸的是,作为承包商工作意味着我不能选择我的IDE或容器或发布方式,所以大多数时候我都被WTP卡住了。

相关问题