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开发人员
较旧或较新版本也应该完成这项工作。
- 在Eclipse IDE中通过Eclipse Marketplace安装JBoss Tools插件
这将为您的IDE安装几个插件,如JBoss AS Server Connector或Maven。 - 将JBoss存储库添加到Maven配置中
窗口 – >首选项 – > Maven – >用户设置 – >打开文件
从JBoss Maven添加存储库入门 - 添加JBoss服务器运行时
窗口 – >首选项 – >服务器 – >运行时环境
按照向导,非常标准 - 从Eclipse Servers选项卡添加Serverinstance
- 创建一个新的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目录下)来定义您的应用程序,如下所示:
....
- 通过Ant任务运行javac时如何查看编译器输出?
- 注入自动连接的依赖项失败; 嵌套exception是org.springframework.beans.factory.BeanCreationException:
- Eclipse IDE-添加jar? 添加外部jar? 添加图书馆?
- ClassNotFoundException启动Tomcat时的DispatcherServlet(Maven依赖项未复制到wtpwebapps)
- 什么是打包具有大量依赖关系的Java应用程序的最佳方法?
- Eclipse在启动时崩溃; 退出代码= 13
- Maven:将第三方jar的导出jar添加到manifest中的classpath
- 如何在Eclipse中调试透视图中的当前执行行
- Android Eclipse中的Node.js和Websocket
- 清理Eclipse中Tomcat的工作目录
- 如何从Java调用scala的Option构造函数