Eclipse + Tomcat – 直接从工作区提供webapp

将Tomcat配置为直接从我工作区内的项目目录中提供服务的理想方法是什么? ( 相关 )

我希望我的静态Web资源可以在我对其进行更改时立即可用,而无需将它们发布到单独的目录中。 看来,实现此目的的最佳方法是直接提供文件,而不是文件的已发布/部署副本。


或者,我对其他选项(不同的应用程序服务器或IDE)持开放态度,这使得开发Java Web应用程序的速度更快。 发布和重新部署每一个小小的变化都会花费太多时间。

我已经尝试过JRebel和FileSync(它们都在某种程度上起作用),但是他们尝试修补一个不应该存在的问题。

我从来没有真正喜欢与Eclipse捆绑在一起的WTP插件。

在过去,我在Eclipse的Sysdeo Tomcat插件方面取得了很大的成功。

它使用Eclipse为您构建的编译类,因此当您进行与接口兼容的更改(如更改方法中的某些内容)时,会立即部署,而无需重新启动。 更改方法签名或在类中添加新方法确实需要重新启动,但由于没有冗长的WAR构建步骤,因此无论如何都会减少整个构建/部署周期。

此外,Sysdeo插件使用工作区中的静态资源,因此无需复制或部署这些资产。 只需进行更改,刷新浏览器,即可立即看到更改。

不幸的是,几年前插件的开发似乎停滞不前。 根据其网站上的矩阵,最新支持的Eclipse版本是3.6。 但是根据这个页面 ,该插件仍然适用于Eclipse 4.2(Juno)。

希望这可以帮助。 使用Sysdeo确实是比WTP更好的体验!

我不想宣传任何东西,但Netbeans IDE支持所有这些开箱即用,没有必要的插件,它还包括一个预配置的tomcat;

它支持在保存时复制静态资源,因此无需重建整个应用程序:

在此处输入图像描述

对于任何java更改,如果您处于调试模式,则会出现“ Apply Code Changes按钮,该按钮将重建和部署已更改的文件(假设未进行任何结构更改)

或者使用具有出色function的JRebel(用于部署已更改的java文件)

我很确定Maven可以做这种事情。 也许甚至有针对Tomcat的Archetypes已经配置了这种行为。

我正在使用Maven Archetype和JBoss AS。 当我更改我的.css或.xhtml文件或任何其他静态资源并将其保存在Eclipse中时,资源会立即与我的部署同步。

编辑:

这是我的解决方案的快速教程:

我在用什么:

  • JBoss AS 7.1.1
  • Eclipse Juno for Java EE开发人员

较旧或较新版本也应该完成这项工作。

  1. 在Eclipse IDE中通过Eclipse Marketplace安装JBoss Tools插件
    这将为您的IDE安装几个插件,如JBoss AS Server Connector或Maven。
  2. 将JBoss存储库添加到Maven配置中
    窗口 – >首选项 – > Maven – >用户设置 – >打开文件
    从JBoss Maven添加存储库入门
  3. 添加JBoss服务器运行时
    窗口 – >首选项 – >服务器 – >运行时环境
    按照向导,非常标准
  4. 从Eclipse Servers选项卡添加Serverinstance
  5. 创建一个新的Maven项目
    请注意,不选中复选框创建简单项目(跳过原型)
    选择Archetype jboss-javaee6-webapp-blank-archetype 7.1.3.CR7

原型

现在您的项目准备好了:)

目前还不清楚您是否使用Eclipse WTP方法与Tomcat或一些自定义部署策略。

我因为不可靠的重新发布更改的JAR而在Eclipse中运行Tomcat。 我现在通过Run Jetty Run Eclipse插件(在Eclipse Marketplace中提供)使用Jetty。 这似乎是从工作区运行的,并不执行Eclipse与Tomcat一起使用的重新发布到部署目录的方法。

您没有使用此选项重新加载动态代码,但您可以使用JRebel添加该function。

进一步左侧字段,切换到JVM语言/框架,支持立即查看更改,而无需重新发布/重新启动,例如:

  • 玩2(Scala和Java)
  • Grails(Groovy)
  • Vert.X(各种JVM语言)。

我建议将sbt与其web插件一起使用。

sbt的关键特性是持续集成模式 :这基本上意味着,如果文件发生变化, sbt触发命令。

所以正常的sbt命令(与web插件相关)是

集装箱:启动
集装箱:停止
container:reload / … container:reload

但在持续集成模式下使用它(以~开头的命令)

〜;容器:启动; 容器:重装/

当源代码或任何其他文件发生更改时 ,它将自动重新加载 Web应用程序。

因此,我只需保存servlet,Java源代码,Scala源代码,并在浏览器中点击重新加载, 这样可以节省大量时间

这是Grails的感觉,但用Java作为主要的编程语言。

附加信息

  • 我已经在终端中运行了(我不知道是否有Eclipse的插件可以从Eclipse中启动它)
  • sbt可以sbt编译Java和Scala项目。
  • web插件正在使用jetty (我不知道是否可以嵌入tomcat
  • 没有必要知道Scala配置sbt ,但是你应该阅读教程。
  • 此解决方案与IDE无关; 所以它也可以在没有IDE的情况下工作(仅从命令行)。

这取决于您是否反对采取某些操作,例如点击发布,或者如果您反对发生的副本,即使它是透明的。 保存时,CSS,HTML或JavaScript等静态内容应自动部署(即复制),假设您在Tomcat的服务器配置中选择“发布”下的“资源更改时自动发布”。 您应该在浏览器中刷新并查看更改,禁止某些浏览器缓存。

如果您真的希望Tomcat直接查看项目的静态文件,那么运行没有部署任何内容的Tomcat(除非您要在同一项目中部署Java类)并Apache Tomcat v7.0 at localhost-config下编辑Servers > Apache Tomcat v7.0 at localhost-config下的server.xml文件Apache Tomcat v7.0 at localhost-config并在Host下添加一些Context元素,如下所示:

  

默认情况下,它仅共享位于$CATALINA_HOME/webapps的应用程序。 您可以在中的$CATALINA_BASE/conf/server.xml中更改它。

检查属性appBase的文档 。

希望它有所帮助。

使用grizzly网络服务器。 它完全在java中实现,因此您具有完全平台独立性,您可以直接从工作区启动它,而无需配置任何外部程序。 静态部署资源很容易。 您只需派生javax.ws.rs.core.Application并添加您的资源,如示例中所示。

 import java.util.HashSet; import java.util.Set; import javax.ws.rs.core.Application; /** * Application class that contains resources for the RESTful web service. * */ public class MyApplication extends Application { public Set> getClasses() { Set> s = new HashSet>(); s.add(com.rest.test.SomeClass.class); return s; } } 

这是配置servlet适配器所必需的。 也可以动态添加资源。 但我不能告诉你动态方法对资源的更新速度有多快。 无论如何,有足够的在线文档。

 private static GrizzlyWebServer getServer(int port, String webResourcesPath, String contextPath) { GrizzlyWebServer gws = new GrizzlyWebServer(port, webResourcesPath); ServletAdapter sa = new ServletAdapter(); /* here they are added statically */ sa.addInitParameter("javax.ws.rs.Application", "com.rest.MyApplication"); sa.setContextPath(contextPath); sa.setServletInstance(new ServletContainer()); sa.setProperty("load-on-startup", 1); gws.addGrizzlyAdapter(sa, new String[] { contextPath }); return gws; 

}

通常,Web应用程序托管在webapps目录下,但也可以将外部目录配置为tomcat中的webapplication主机目录。 您只需将eclipse工作区项目输出目录设置为应用程序库即可。 这可以通过使用Tomcat的管理器应用程序从外部目录部署应用程序,或者只需编辑server.xml(在conf目录下)来定义您的应用程序,如下所示:

 ....