草庐IT

Java Web 部署 : build code, 或部署 .war?

coder 2024-03-06 原文

部署 J2EE/Java Web 应用程序的两种主要方式(在非常简单的意义上):

将组装好的工件部署到生产箱

在这里,我们在别处创建了 .war(或其他),为生产配置它(可能为许多盒子创建许多工件)并将生成的工件放在生产服务器上。

  • 优点:生产环境中没有开发工具,可以直接重复使用来自测试的工件,进行部署的人员不需要了解构建过程
  • 缺点:创建和部署工件的两个过程;预构建工件的潜在复杂配置可能会使流程难以编写脚本/自动化;必须对二进制工件进行版本控制

在生产箱上构建工件

在这里,日常用于在开发人员机器上本地构建和部署的相同流程用于部署到生产环境。

  • 优点:需要维护的一个过程;并且经过频繁使用的严格测试/验证。在创建工件时可能更容易自定义配置,而不是在事后自定义预构建的工件;不需要二进制工件的版本控制。
  • 缺点:所有生产环境都需要潜在的复杂开发工具;部署人员需要了解构建过程;你没有部署你测试过的东西

我主要使用第二个过程,不可否认是出于必要(没有时间/优先考虑另一个部署过程)。就我个人而言,我不赞同“生产环境必须清除所有编译器等”之类的论点,但我可以看到部署您测试过的内容的逻辑(而不是构建另一个人工制品)。

但是,Java 企业应用程序对配置非常敏感,拥有两个配置工件的进程感觉像是在自找麻烦。

想法?

更新

这是一个具体的例子:

我们使用 OSCache,并启用磁盘缓存。配置文件必须在 .war 文件中并且它引用文件路径。此路径在每个环境中都不同。构建过程检测用户的配置位置并确保放置在 war 中的属性文件对于他的环境是正确的。

如果我们要使用构建过程进行部署,则需要为生产环境创建正确的配置(例如 production.build.properties)。

如果我们要遵循“将组装的工件部署到生产环境”,我们将需要一个额外的过程来提取(不正确的)OSCache 属性并将其替换为适合生产环境的属性。

这会创建两个进程来完成同一件事。

所以,问题是:

  • 这是否可以在不“在生产环境中编译”的情况下避免?
  • 如果不值得,这值得吗? “生产不编译”的值(value)是否大于“不要重复自己”?

最佳答案

我坚决反对在生产环境中构建,因为这意味着您使用的构建与测试时不同。这也意味着每个部署机器都有不同的 JAR/WAR 文件。如果没有别的,做一个统一的构建,这样在跟踪错误时你就不必担心服务器之间的不一致。

此外,如果您可以轻松地在构建与创建它的源之间进行映射,则无需将构建置于版本控制中。

在我工作的地方,我们的部署流程如下。 (这是在 Linux 上,使用 Tomcat。)

  1. 测试更改并 checkin Subversion。 (不一定按这个顺序;我们不要求对提交的代码进行测试。我是唯一的全职开发人员,所以 SVN 树基本上是我的开发分支。您的里程可能会有所不同。)

  2. 将 JAR/WAR 文件复制到生产服务器中以 Subversion 修订号命名的共享目录中。 Web 服务器只有读取权限。

  3. 部署目录包含指向修订命名目录中文件的相对符号链接(symbolic link)。这样,目录列表将始终向您显示生成运行版本的源代码版本。部署时,我们更新一个日志文件,它只不过是一个目录列表。这使得回滚变得容易。 (不过有一个问题;Tomcat 根据真实文件的修改日期而不是符号链接(symbolic link)来检查新的 WAR 文件,因此我们必须在回滚时接触旧文件。)

我们的网络服务器将 WAR 文件解压缩到本地目录中。该方法是可扩展的,因为 WAR 文件位于单个文件服务器上;我们可以拥有无​​限数量的 Web 服务器,并且只进行一次部署。

关于Java Web 部署 : build code, 或部署 .war?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/141693/

有关Java Web 部署 : build code, 或部署 .war?的更多相关文章

  1. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

    我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

  2. ruby-on-rails - Ruby on Rails 可以部署在 Azure 网站上吗? - 2

    我可以在Azure网站上部署RubyonRails吗? 最佳答案 还没有。目前仅支持.NET和PHP。 关于ruby-on-rails-RubyonRails可以部署在Azure网站上吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/12964010/

  3. jenkins部署1--jenkins+gitee持续集成 - 2

    前置步骤我们都操作完了,这篇开始介绍jenkins的集成。话不多说,看操作1、登录进入jenkins后会让你选择安装插件,选择第一个默认的就行。安装完成后设置账号密码,重新登录。2、配置JDK和Git都需要执行路径,所以需要先把执行路径找到,先进入服务器的docker容器,2.1JDK的路径root@69eef9ee86cf:/usr/bin#echo$JAVA_HOME/usr/local/openjdk-82.2Git的路径root@69eef9ee86cf:/#whichgit/usr/bin/git3、先配置JDK和Git。点击:ManageJenkins>>GlobalToolCon

  4. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  5. Ruby,使用包含 TK GUI 的 ocra 部署一个 exe - 2

    Ocra无法处理需要“tk”的应用程序require'tk'puts'nope'用奥克拉http://github.com/larsch/ocra不起作用(如链接中的一个问题所述)问题:https://github.com/larsch/ocra/issues/29(Ocra是1.9的"new"rubyscript2exe,本质上它用于将rb脚本部署为可执行文件)唯一的问题似乎是缺少tcl的DLL文件我不认为这是一个问题据我所知,问题是缺少tk的DLL文件如果它们是已知的,则可以在执行ocra时将它们包括在内有没有办法知道tk工作所需的DLL依赖项? 最佳答

  6. ruby-on-rails - NameError(未初始化常量 Unzipper::Zip)但仅在 Heroku 部署(Rails)上 - 2

    我有一个类unzipper.rb,它使用Rubyzip解压文件。在我的本地环境中,我可以成功解压缩文件,而无需使用require'zip'明确包含依赖项但是在Heroku上,我得到一个NameError(uninitializedconstantUnzipper::Zip)我只能通过使用明确的require来解决问题:为什么这在H​​eroku环境中是必需的,但在本地主机上却不是?我的印象是Rails自动需要所有gem。app/services/unzipper.rbrequire'zip'#OnlyrequiredforHeroku.Workslocallywithout!class

  7. ruby - Sinatra + Heroku + Datamapper 使用 dm-sqlite-adapter 部署问题 - 2

    出于某种原因,heroku尝试要求dm-sqlite-adapter,即使它应该在这里使用Postgres。请注意,这发生在我打开任何URL时-而不是在gitpush本身期间。我构建了一个默认的Facebook应用程序。gem文件:source:gemcuttergem"foreman"gem"sinatra"gem"mogli"gem"json"gem"httparty"gem"thin"gem"data_mapper"gem"heroku"group:productiondogem"pg"gem"dm-postgres-adapter"endgroup:development,:t

  8. ruby-on-rails - 在服务器上没有互联网访问权限的 Capistrano 部署 - 2

    如何使用Capistrano将Rails应用程序部署到无法访问外部网络或存储库的生产或暂存服务器?我已经设法完成部署的一半,并意识到Capistrano没有在我的本地机器上下载gitrepo,但它首先连接到远程服务器并尝试在那里下载Git存储库。我希望有一个类似Javaee的构建系统,其中创建可交付成果并将该可交付成果发送到服务器。就像您构建.ear文件并将其部署到您想要的任何服务器上一样。显然在RoR中,你被迫(据我所知)在该服务器上构建应用程序,在那里创建一个gem存储库,在那里克隆最新的分支等等。有什么方法可以将准备运行的包发送到远程服务器吗? 最佳答

  9. Streampark集成Cloudera Flink、ldap、告警,以及部署常见问题 - 2

    集成背景我们当前集群使用的是ClouderaCDP,Flink版本为ClouderaVersion1.14,整体Flink安装目录以及配置文件结构与社区版本有较大出入。直接根据Streampark官方文档进行部署,将无法配置FlinkHome,以及后续整体Flink任务提交到集群中,因此需要进行针对化适配集成,在满足使用需求上,尽量提供完整的Streampark使用体验。集成步骤版本匹配问题解决首先解决无法识别Cloudera中的FlinkHome问题,根据报错主要明确到的事情是无法读取到Flink版本、lib下面的jar包名称无法匹配。修改对象:修改源码:(解决无法匹配clouderajar

  10. ruby - 部署 Rack 应用程序的可靠方法 (Sinatra) - 2

    我正在寻找一种可靠的方式来部署Rack应用程序(在本例中为Sinatra应用程序)。请求将花费一些时间(0.25-0.5秒等待代理HTTP请求)并且可能会有相当大的流量。我应该使用传统的mongrel集群设置吗?使用HAProxy作为负载均衡器?恩金克斯?架子?您使用过哪些解决方案,有哪些优势? 最佳答案 Nginx/unicornFTW!前面的Nginx提供静态文件和unicorn处理Sinatra应用程序。优点:性能、使用unixsocks的良好负载平衡以及无需停机即可部署/升级(您可以在不停机的情况下升级Ruby/Nginx/

随机推荐