将Tomcat配置为直接从我工作区内的项目目录中提供服务的理想方法是什么? (related)
我希望我的静态网络资源能够在我对其进行更改时立即可用,而无需将其发布到单独的目录中。似乎最好的方法是直接提供文件而不是文件的已发布/部署副本。
或者,我对其他选项(不同的应用程序服务器或IDE)持开放态度,这使得开发Java Web应用程序的速度更快。发布和重新部署每一个小小的变化都会花费太多时间。
我尝试过JRebel和FileSync(它们都在某种程度上起作用),但是他们尝试修补一个不应该存在的问题。
答案 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中时,资源会立即与我的部署同步。
修改强>
以下是我的解决方案的快速教程:
我在用什么:
旧版本或更新版本也应该开展工作。
现在你的项目准备好了:)
答案 2 :(得分:5)
我不想宣传任何东西,但是Netbeans IDE支持所有这些开箱即用,没有必要的插件,它还包括一个预配置的tomcat;
它支持在保存时复制静态资源,因此无需重建整个应用程序:
对于任何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语言/框架,支持立即查看更改,而无需重新发布/重新启动,如:
答案 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
)sbt
,但您应该阅读本教程。答案 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>