我的工作区中有几个动态 Web 项目,每个项目都包含类并引用其他实用程序项目(简单的 Java 项目)和第 3 方 jar。
这些应用程序(动态Web项目)使用eclipse WTP(Helios 3.6)部署在tomcat v6.0.6上
当我更新工作区并从 SVN 存储库中提取新的类/资源/jar 时,我在 tomcat 应用程序中重新发布我的应用程序,然后重新启动它。
有时,当 tomcat 启动我的应用程序之一时,它会抛出 ClassNotFoundException,或抱怨其他缺少资源。有时我看到部署的资源(例如 spring beans xml)不是最新的,并且其中包含“旧”内容。
我使用的常见反巫毒黑魔法治疗方法: * 停止/启动tomcat * 清理(右键单击服务器配置时) * 清理tomcat工作目录 * 从tomcat中删除所有应用程序,清理,重新启动tomcat,添加所有应用程序
我需要多次运行这个“程序”,直到问题解决。
你们也有这样的困扰吗?这是一个已知的错误 ? 有什么建议如何解决吗?使用 jars 而不是实用项目会解决/减少这个问题吗?
我会考虑使用嵌入式 Jetty,我只是想避免使用专有脚本在“生产”环境中运行 Jetty。
--约纳坦
这种事在我身上发生过很多次。我不会称其为巫毒。我认为当您在后台更改内容(例如 Maven 构建)时,Eclipse WTP 无法正常工作。
我为解决这个问题所做的就是完全避免使用它。相反,我使用 Maven WAR 插件来部署应用程序:
mvn war:inplace tomcat:inplace -DskipTests=true
这工作得非常快,因为它不需要组装和打包战争。
然后取消部署应用程序:
mvn tomcat:undeploy
我有脚本
它看起来像这样:
启动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
取消部署并停止 tomcat:
#!/bin/sh
mvn tomcat:undeploy
<path-to-tomcat>/shutdown.sh -force
rm $CATALINA_PID
可能与任何其他构建脚本相同 - 这只是您需要编写多少代码的问题。
我选择Maven的war:inplace目标是因为它做的事情很少,因此运行得非常快。请参阅此处:maven.apache.org/plugins/maven-war-plugin/usage.html。
顺便说一句,ANT 和 Gradle 有一个 war 任务/插件,可以配置它来执行类似的操作(我不太记得了......)
希望这有帮助。
另一件事需要注意的是
Project -> Build Automatically
应该启用并且项目不应该有任何构建路径问题。
打开导航器视图并确认构建文件夹已生成
class
文件。
如果文件没有被构建,它们将不会被发布。虽然这看起来很明显,但很容易被忽视并浪费我很多时间。
有趣的行为......由于权限问题,我的 Linux 机器上也发生了类似的事情。
无论如何,我建议不要使用WTP。尝试使用 ant 构建脚本。它很简单,对我来说效果很棒。
自从Eclipse出来以来一直在使用,这些问题一直存在。到达这里是因为 atm 我的 web.xml 不再部署。特别是与 m2eclipse 结合使用时,您将永远不知道尝试启动 Tomcat 时会发生什么。我认识的每个使用 Eclipse 的人都遇到过这些问题,我不明白为什么它们没有得到解决...不幸的是,作为承包商工作意味着我无法选择我的 IDE、容器或发布方式,所以大多数时候我都坚持 WTP。
我也有类似的问题。当我发布一个 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>
一个可能的解决方案可能是您的 bin 文件夹没有被创建。检查您是否没有删除 build/bin 文件夹并且它确实存在于您的工作空间中。
TL;DR 在eclipse中刷新
Package Explorer
并发布(或重新发布)服务。
此问题主要发生在 eclipse/wtp 上下文之外创建文件时。例如,maven 构建过程可能会在
..$1.class
文件夹下生成 target
文件。除非首先刷新 Package Explorer
,否则 eclipse/wtp 在发布时会忽略这些内容。
当在 IDE 外部创建文件时,这似乎是 eclipse/wtp 的限制。