【问题标题】:java web application best practicesJava Web 应用程序最佳实践
【发布时间】:2011-02-18 21:57:52
【问题描述】:

我试图找出开发和发布一个相当简单的 Web 应用程序的最佳方法,但遇到了几个问题。我将概述我所做的决定,因为在某个地方我显然已经出轨了。非常感谢您的帮助!

我有一个我认为相当简单的网络应用程序。它包含几个引用几个 java bean 的 jsps,以及通常的静态 html、js、css 和图像。

决定 1) 我希望有一个清晰、干净的发布程序,这样我就可以在本地机器上进行开发,然后可靠地发布到生产机器上。因此,我决定将应用程序打包成一个 war 文件(包括所有静态资源),以最大限度地减少我需要发布的单独的点点滴滴。到目前为止这么好?

决定 2) 我希望本地机器上的东西尽可能与生产环境相似。因此,例如,在我的 html 中,我可能引用了一个静态文件,例如 http://static.foo.com/file 。为了让这段代码在 dev 和 prod 上无缝运行,我决定在本地开发时将 static.foo.com 放在我的 /etc/hosts 中,这样所有 url 都可以正常工作而无需更改任何内容。

决定 3) 我决定使用 eclipse 和 maven 为我提供管理和构建项目的最佳实践环境。

所以我现在有一个很好的设置,除了:

每次我想更改开发中的任何内容,例如 html 文件中的一行,我都必须重新构建整个项目,然后等待 tomcat 加载战争,然后才能查看它是否是我想要的。所以我的问题是:

1)有没有办法连接eclipse和tomcat,这样我就不必每次都重建战争? ie tomcat 是直接查看我的实际工作区来提供静态文件吗?

2)我想我可能会通过使用 /etc/hosts 来反映生产 url 让事情变得更难 - 有没有更好的方法不涉及手动更改 url(相对 url 当然可以,但是你在哪里有很多子域,一个是静态文件,一个是动态文件,你肯定要写出完整路径吗?)

3) 这真的是最佳实践吗?人们如何进行设置,以便他们一方面平衡对自动化、包罗万象的构建过程的要求,以及能够快速开发 javascript、html 和 css 的速度和灵活性,就像一个人刚刚指出的一样快apache在目录中并现场开发?人们发现什么作品?

非常感谢!

编辑:感谢大家的精彩回复!如果我能把它们标记好,我会的。这真的帮助了我。我听到的是最佳实践是在开发中保留 webapp 的结构,并在尽可能接近生产的环境中运行它。似乎人与人之间的差异在于人们准备将资源热部署到 servlet 容器中的程度,绕过构建过程以获得额外的速度或便利。这就说得通了。再次感谢。

【问题讨论】:

    标签: java html eclipse apache tomcat


    【解决方案1】:

    这很像我在工作中必须做的,尽管我们使用 ant(现在?)。此外,当我使用一个(或两个)IDE 时,我拒绝将一个作为我的构建过程的一部分,永远。需要有人能够理解和调整您的构建。

    【讨论】:

    • 免责声明:我会打破玩具/一次性项目的“无 IDE 构建”。但不适用于发布到生产工作环境中的东西。
    【解决方案2】:

    有没有办法连接eclipse 和tomcat,这样我就不必 每次都重建战争?

    1) 我认为您过于依赖 IDE。通常我有一个 Ant build.xml,它有几个任务:一个是“构建战争”,另一个是“更新 jsps”。构建战争会编译所有代码,将其打包,将其部署到 Tomcat 并重新启动一切。更新 jsps 不会重新启动服务器,它只是从我的本地文件直接复制到 Tomcat 的部署实例。由于它们是 JSP,因此无需重新启动。大约需要半秒钟。

    你有很多子域,比如说 一个用于静态文件,一个用于 动态的,你必须写出 完整的路径,确定吗?

    2) 不可能,何塞。所以你的意思是任何时候服务器名称发生变化,你都必须重新编译你的代码?如果您需要支持动态 URL,您可能只想咬紧牙关,看看一个框架来为您完成繁重的工作。我偏爱Stripes(它支持开箱即用的动态 URL 重写)……还有其他的。

    【讨论】:

    • 对不起,我对子域网址点不是很明确。我的意思是,如果您的代码中只有相对 url,例如 href=file.html,那么它们在 dev 和 prod 上同样有效。但是,如果您有一个位于 www.foo.com 的文件 f.html,其 html 引用了位于 STATIC.foo.com 的文件 f2.html,例如 href=STATIC.foo.com/f2.html ,那么您可以使这些 url 在dev 和 prod 通过将条目放入 /etc/hosts 文件中,如下所示: 127.0.0.1 www.foo.com STATIC.foo.com 现在在 dev 中,这些 url 都解析到您的本地计算机,这就是您想要的,无需更改代码。
    • 如果您绝对必须指定完整的 URL,我认为您当前的方法可能是最好的。我肯定会采纳whaley 的建议,重新:自动化这部分流程。
    【解决方案3】:

    要回答 #1,我建议如下:

    1. 花一些时间学习 maven 以在没有 Eclipse 的情况下构建您的 .war。使用适当的原型并不难。更多详情请看这里:http://maven.apache.org/guides/mini/guide-webapp.html
    2. Maven 可以通过mvn eclipse:eclipse 或使用 m2 插件生成 eclipse 项目
    3. 要部署到本地计算机和生产环境,请使用 maven cargo 插件。 http://cargo.codehaus.org/Maven2+pluginhttp://blank.jasonwhaley.com/2010/03/automated-deployment-with-cargo-drive.html

    要回答问题 #2,修改 /etc/hosts 文件以模拟生产没有任何问题。只需有一个快速脚本,可以让您添加/删除这些条目并刷新您的 dns 缓存。我一直都是这样做的。 (请确保您的浏览器也通过其相关设置经常清除其缓存)。

    回答问题#3)是的,这就是你应该做的事情。每个构建都应生成一个可部署的工件,您可以一步将其部署到您的任何环境中。您需要确保可以在没有 IDE 的情况下执行此操作,并且仅将 IDE 用作在开发阶段为您提供帮助的工具。

    【讨论】:

    • 谢谢惠利。所以我很清楚 - 你是否确认即使我想在一行 javascript 中放置一个快速警报,或者更正 html 文件中某些文本中的错字,我也需要等待战争重建然后部署(即使是自动)到我的开发 servlet 容器,然后我才能看到更改的结果?如果是这样,与仅将某些内容指向项目文件的效率相比,这感觉非常生硬。我是否理解正确,还是我遗漏了什么?
    • 这正是我的建议。如果您的生产部署包含 .war 文件,那么您的开发部署也应该是这样的。 Java webapps 旨在作为战争捆绑和部署 - 我发现如果您不尝试绕过该约定,生活总是会容易得多。
    • 使用 Eclipse 的 webtools/EE 版本,您可以将您的项目与本地 tomcat(或其他容器)安装“链接”,这样您就可以预览小的更改而无需等待战争生成/部署。
    【解决方案4】:

    其他人已经回答了你,我将对此发表评论(顺便说一句,评论太长了,所以我将其作为答案):

    每次我想改变什么 在开发中,就像一条线 html文件,我必须重建 整个项目,然后等待 tomcat加载战争之前我可以 看看是不是我想要的。

    如果你在一个 html 文件中更改了一行,就不需要重新构建整个项目。

    请注意,我总是重建完整的 .war 并重新部署我的 .war 但这需要不到两秒(不到一秒重新压缩 .war [这就是 .war 的真正含义,一个压缩文件] 并且不到一秒钟即可重新部署它),因为:

    • 只需更改 html 文件中的一行,无需重新编译整个项目

    当您更改一个 .java 文件时也是如此:您可以简单地重新编译该文件并重新战争。

    我从头开始编写了自己的 Ant 构建文件(这里没有 Maven)并且我有几个目标。我可以强制执行“干净构建”,这将重新编译所有内容,但通常我只是重新打包和重新部署 .war

    您可以自己检查:构建一个 .war,将其解压缩到目录 dir1,然后修改一个 .html(或一个 .java/.class 文件)并构建一个新的.war 并将新的 .war 解压缩到 dir2 中。

    然后比较 dir1dir2:现在修复您的构建过程,以便您可以创建第二个 .war 而无需重新编译所有内容。

    更改一个 .html、.java、.jsp、.css、.js / 任何文件并重新部署一个新的 .war 应该是几秒钟的事(如果你没有把厨房水槽扔进你的Web 应用程序)。

    请注意,在同一个项目中,这里的另一个开发人员更喜欢“热部署”/直接在分解的 webapp 中替换文件(我更喜欢每次都重新部署一个 .war,因为我的完整重新打包/重新部署只需不到两秒这种方式我没问题)。

    【讨论】:

    • 哎呀,忘了精确了:我有一个 非常 快速的 Linux 工作站,它有一个 sh!tload 内存,所以事情往往比我的同事系统更快(谁在 OS X MacBook Pro 上,机器不错,但速度远不及我的系统):) 但是,一切都应该在几秒钟内完成。 [顺便说一句,当我在奔跑时,我也有一个 MBP:这对 Apple 来说可不便宜]
    【解决方案5】:

    如果您的项目是 Eclipse 中的 Dynamic Web App 并且正确配置了 Tomcat 服务器,则无需重新构建 war 文件。请按照以下说明操作:

    1) 查看下面如何使用 eclipse 配置 tomcat 服务器: http://greatwebguy.com/programming/eclipse/make-eclipse-and-tomcat-play-nice-together/

    2) 为您的应用程序使用相对路径,而不是绝对路径。

    3) 如果您正确地遵循上述 2 个步骤,那么您就有了一个最佳的开发环境。

    【讨论】:

      【解决方案6】:

      在开发过程中,您应该配置 eclipse 和 tomcat 以便不需要重新构建/重新部署。修改html/css/jsp等,保存,刷新浏览器查看效果。

      但在部署到生产站点之前,您应该进行干净的完整构建并仔细测试。

      域:它们应该在配置文件中; dev 和 prod 应该有不同的配置文件。

      【讨论】:

        猜你喜欢
        • 2012-06-06
        • 2011-02-16
        • 2011-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-14
        相关资源
        最近更新 更多