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

时间:2013-06-25 18:49:41

标签: java eclipse tomcat

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

我希望我的静态网络资源能够在我对其进行更改时立即可用,而无需将其发布到单独的目录中。似乎最好的方法是直接提供文件而不是文件的已发布/部署副本。


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

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

9 个答案:

答案 0 :(得分:9)

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

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

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

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

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

希望这会有所帮助。使用Sysdeo确实比WTP更好!

答案 1 :(得分:5)

我很确定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 Getting started
  3. 添加存储库
  4. 添加JBoss服务器运行时
    窗口 - >偏好 - >服务器 - >运行时环境
    按照向导,非常标准
  5. 从Eclipse Servers选项卡添加Serverinstance
  6. 创建一个新的Maven项目
    请注意复选框创建一个简单的项目(跳过原型) 已检查
    选择Archetype jboss-javaee6-webapp-blank-archetype 7.1.3.CR7
  7. Archetype

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

答案 2 :(得分:5)

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

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

enter image description here

对于任何java更改,如果您处于调试模式,则会有一个Apply Code Changes按钮,它将重建和部署您更改的文件(假设没有进行任何结构更改)

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

答案 3 :(得分:2)

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

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

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

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

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

答案 4 :(得分:1)

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

sbt的关键功能是持续集成模式:这基本上意味着,sbt会在文件发生变化时触发命令。

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

  

容器:启动
  集装箱:停止
  container:reload / ... container:reload

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

  

〜;容器:启动; container:reload /

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

所以我只保存servlet,Java源代码,Scala来源,并在浏览器中点击重新加载,确实节省了大量时间

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

其他信息

  • 我在终端中运行sbt(我不知道Eclipse是否有一个插件可以从Eclipse中启动它)
  • sbt可以开箱即用地编译Java和Scala项目。
  • 网页插件正在使用jetty(我不知道是否可以嵌入tomcat
  • 无需知道Scala配置sbt,但您应该阅读本教程。
  • 此解决方案与IDE无关;所以它也可以在没有IDE的情况下工作(仅从命令行开始)。

答案 5 :(得分:1)

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

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

<Context docBase="C:\path\workspace\project\WebContent\css" path="/project/css" reloadable="true" />

答案 6 :(得分:0)

默认情况下,它仅共享$CATALINA_HOME/webapps中的应用。您可以在$CATALINA_BASE/conf/server.xml的{​​{1}}中进行更改。

检查documentation属性<Host />

希望它有所帮助。

答案 7 :(得分:0)

使用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<Class<?>> getClasses() {
        Set<Class<?>> s = new HashSet<Class<?>>();
        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;

}

答案 8 :(得分:-1)

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

....

<Context docBase="D:\your\eclipse\workspace\project\WebContent" path="/projectbaseurl"   reloadable="true"/>

</Host>
</Engine>
</Service>
</Server>