18

将我的 web 项目(或 ear 项目)部署到远程服务器和 glassfish 的最佳方式是什么?

如何使用 netbeans 为此目的创建的 ant-deploy.xml 和 build-impl.xml?

使用 autodeploy 文件夹并单独将 sun-resources.xml 添加到 GF 或使用 ant 和....

请你一步一步解释我好吗?

问候

4

6 回答 6

24

好吧,您可以通过管理控制台手动部署您的应用程序。

或者你可以使用asadmin命令。最简单的远程部署如下所示:

asadmin deploy --user=<adminuser> --host=<hostname> <path to jar/war/ear>

这可以是 shell 脚本,或者包装在 Ant 或 Maven 中。

或者您可以使用更专业的工具(Ant Taskmaven glassfish 插件maven asadmin 插件Cargo)。

这一切都取决于您的上下文,没有单一的答案,并且有很多可能性。如果您不知道自己在寻找什么,只需使用 NetBeans 创建的 Ant 构建脚本。

于 2010-09-05T08:25:45.177 回答
16

1. 先简答

使用以下组合:

  1. maven,驱动整个构建和部署过程(配置文件资源过滤将是您非常有价值的功能)
  2. 使用asadmin命令的shell脚本(glassfish maven 插件之一的替代品)
  3. jenkins触发 maven 构建,可以是定期的,也可以是新代码推送到版本管理系统的结果。
  4. Netbeans与 Glassfish 和 maven 完美集成,是我最喜欢的 Java EE IDE:

2. 现在,一些背景...

要回答这个问题,有必要采取更广泛的视角并考虑整个开发/部署生命周期。在 Glassfish 中实际部署 .war 或 .ear 档案只是周期的一步。

如果您想真正有效,您需要考虑工具和实践的组合,以自动构建和部署您的软件应用程序。如果您在具有开发人员机器、持续集成机器、QA 机器和生产机器的“真实世界”环境中工作,则尤其如此。

我将在以下段落中详细说明这些项目。特别是,我将解释为什么我认为今天由 maven 驱动的自定义 shell 脚本比社区中可用的 glassfish maven 插件更好。

3. 使用maven构建管理

对于很多做java开发的人来说,maven是个耳熟能详的工具。对于其他人,这里是一个非常简短的介绍。maven 的目标是自动构建软件工件。它是一个框架(与面向对象的框架具有相同的意义),这意味着:

  1. 它定义了构建、打包和测试软件的标准方法
  2. 它为您提供了扩展点以围绕这种标准方式附加自定义行为

本质上,当你使用 maven 时,你描述了你正在构建什么样的软件工件(它是一个 .jar,它是一个 .war,它是一个 android 应用程序,等等)。默认情况下,maven 期望在特定位置找到源文件、测试文件和资源。默认情况下,maven 知道构建软件需要经历不同的阶段:编译、单元测试、打包、部署、集成测试、文档生成等。

maven 为您做的另一件事(这通常是使用该工具的第一个原因)是依赖管理。Maven 指定了一种识别库(带有名称和版本)的方法,这些库可通过存储库(有公共、全局存储库和私有存储库)提供。使用 maven,您可以指定诸如“我依赖于 magiglib 版本 1.2.2”之类的内容。当您要求 maven 进行构建时,它会自动获取 lib,将其存储在本地存储库中,并将其用于构建和打包。无需处理 .jar 文件的手动传输,不存在引入错误的风险,因为不同开发人员或在不同阶段使用相同库的不同版本。

最后但同样重要的是,maven 提供了根据目标部署机器定制软件结构的能力。考虑以下用例:

  • 开发的时候想想每个开发者的安装可能不一样(mysql可能不会监听同一个TCP端口,glassfish可能没有安装在同一个目录,密码会不一样等等)。

  • 开发机器显然不同于持续集成环境,而持续集成环境本身也不同于 QA 或生产环境(再次,只需考虑网络、文件系统、凭据)。

Maven 通过变量配置文件资源过滤的组合来支持这些用例:

  • 变量就像任何类型的编程环境中的变量一样。使用 maven 时,编写一个 XML 配置文件(pom.xml),可以在其中使用变量。这使您的构建系统可配置和动态。mysql监听的端口或者glassfish的安装目录可以定义为变量。
  • 配置文件是一种为一组 Maven 变量赋值的方法。通常,每个开发人员都会有一个配置文件,每个环境(从持续集成到生产)都会有一个配置文件,等等。
  • 资源过滤允许您在源文件、资源文件和配置文件中引用 maven 变量。例如,在 java 文件中,您可以嵌入以下字符串 ${myvar}。如果您配置 maven 进行资源过滤,那么它将用 maven myvar 变量的值(可能在当前配置文件中定义)替换 ${myvar}。

Maven 是一个非常强大的工具,因此具有学习曲线。如果您使用 Netbeans,您实际上可以通过单击几下创建一个 Maven 驱动的项目,并从基本功能(例如依赖项管理)中受益。对于高级主题,有非常好的文档可用。在这里我不再赘述。

4. glassfish 插件...与否?

一旦您了解了 maven 的价值并决定使用它,下一个问题是如何使用它来将 .war 或 .ear 存档实际部署到 Glassfish(本地或远程)。这是你有很多选择的地方,也是多年来我们学到很多东西的地方(我们已经使用 maven 和 glassfish 好几年了)。

您可以做的第一件事是使用 glassfish maven 插件之一。有不同的插件可用。他们有完全不同的能力和不同程度的支持。事实证明,最强大的插件实际上已不再受支持,并且无法与开箱即用的 Glassfish 3 一起使用。该插件很有趣,因为它不仅可以将档案部署到 Glassfish 中,还可以创建资源(jdbc 池、jms 队列等)。它还使得动态创建 glassfish 域成为可能(对于运行集成测试并确保使用新域非常有用)。无论如何,新插件(在​​产品文档中描述)不是那么强大,并且完全专注于部署任务。

在我们多年来创建和改进的构建系统中,通过将 glassfish maven 插件与配置文件和资源过滤相结合,我们能够实现很多控制和灵活性。该解决方案有效,可靠,但相当复杂(我们的 pom.xml 和 settings.xml 增长了很多并且变得沉重)。

所以,如果我从头开始建立一个新的构建系统,我可能会做一些不同的事情。如果您查看 glassfish maven 插件的代码,您会发现它们几乎是 Glassfish 提供的asadmin命令行工具的包装器(这是因为 asadmin 的参数和行为已从一个 glassfish 版本更改为另一个maven插件已经坏了)。

5. 前进的道路

我会做的是:

  • 编写一组 shell 脚本来创建 glassfish、创建资源(jdbc、jms 等)、部署.war 和 .ear。脚本将使用asadmin与 glassfish 交互(可以在本地远程使用 asadmin );

  • 在这些脚本中嵌入maven 变量并使用资源过滤来动态创建脚本的特定环境版本

  • 使用maven exec 插件在maven 构建周期的不同阶段(集成测试、运行、自定义目标等)运行脚本。

于 2012-10-23T13:02:52.697 回答
10

您可以使用ant任务将war文件部署到glassfish-V3;

Build.xml 内容;

<target name="deploy"
    description="deploys application to glassfish">
    <exec failonerror="true" executable="cmd">
     <arg value="/c" />
     <arg value="asadmin --user ${gfUser} --passwordfile ${gfPassFile} --host ${host} deploy build/${war}" />
    </exec>
</target>
于 2010-11-23T07:54:42.567 回答
5

更多独立于操作系统的方式来部署应用程序:

<presetdef name="asadmin">
  <java jar="${glassfish.home}/modules/admin-cli.jar" fork="true" jvm="${java.home}/bin/java" >
    <arg line="--port ${glassfish.admin.port}" />
  </java>
</presetdef>
<target name="deploy">
  <asadmin failonerror="true">
    <arg value="deploy" />
    <arg value="--force=true" />
    <arg value="${ear.file}" />
  </asadmin>
</target>

您可以将 asadmin 预设与任何 asadmin 任务一起使用...

于 2011-09-04T13:54:18.227 回答
1

我发现根据您的情况,有几种方法效果很好:

当您可以访问正在运行的 Glassfish 3 的文件系统时进行部署:

Glassfish 允许对放置在正在运行的 Glassfish 文件“内部”的正确位置的资源进行自动热部署。Glassfish 3.1.2.2 的默认位置是glassfish-3.1.2.2/glassfish/domains/domain1/autodeply. 我以前发现在 Windows 下它偶尔不会发现文件已更新,因此可能需要先删除并等待取消部署,然后再重新部署。

手动部署到远程 Glassfish 3

管理员页面(默认端口 4848)包含一个部署部分,允许用户上传和部署、禁用和启用以及取消部署应用程序。这是我发现手动维护最强大的方法。

它也不需要对底层服务器的完全访问。

自动部署到远程 Glassfish 3

cargo 项目允许自动部署到适当配置的 Glasfish 实例。

使用描述 war 部署的 pom.xml 执行的以下命令将(截至 2012 年 10 月 17 日)下载并执行一个 glassfish,并将当前项目部署到它。

mvn clean verify -Dcargo.maven.containerId=glassfish3x -Dcargo.maven.containerUrl=http://dlc.sun.com.edgesuite.net/glassfish/3.1.2.2/release/glassfish-3.1.2.2-web.zip  org.codehaus.cargo:cargo-maven2-plugin:run

(连同 pom.xml 中的一个小片段,告诉货物有关 glassfish 位置的其他详细信息)

Maven 开发构建的一部分,例如 jetty:run

Glassfish 3 对 Maven 的支持很好。主要的好处是您不需要手动下载、解压和启动 Glassfish - maven 可以自动完成这一切。

有关说明,请参见http://embedded-glassfish.java.net/

我只是简单地使用了它,但它似乎是以 IDE 为中心的解决方案的一个不错的替代方案。

于 2012-10-25T08:51:07.627 回答
0

为@Pascal Thivent 的回答加分,(我希望它对其他有类似问题的人有所帮助)

1) 只需单击鼠标即可使用 Netbeans 启动、停止、部署应用程序。

2)除了使用 Eclipse 或 Netbeans 或您最喜欢的 IDE

2.1) 在 Windows 开发环境中:在开发过程中从 asadmin 等命令行工具开始。2.2) 在 Linux 开发环境中:使用 shell 脚本并自动化部署过程。

2.3)在开发环境中使用自动部署和Netbeans远程部署。2.4)根据需要使用脚本或命令行远程部署

3)您提出了最合适的方法,例如根据项目需求和兴趣以及组织流程等其他考虑因素开发“构建脚本”。

如果没有 maven 或 ant,手动添加必要的 jars 一点也不坏。添加 jars 后,从管理控制台部署或仅使用构建脚本。

Maven 使用 JavaEE jar 有时会失败..但是您在 SO 中有解决方案。根据现有的示例项目和组织流程,我有时会使用 Maven。我还使用 Netbeans Java EE 项目默认的 ant。

于 2013-04-24T08:10:17.897 回答