java grails mave_Grails 与 Maven 集成

article/2025/9/13 18:44:29

Grails 与 Maven 集成

2771ca892c7b2591131a36eb05b9a9bb.png

杨 健

2013 年 9 月 09 日发布

概述

Grails 简介:Grails 是一个开源的 Web 开发框架,它采用动态语言 Groovy 进行开发,并且可以和用 Java 开发的项目进行集成。Grails 充分体现了约定优于配置的原则,将项目的配置减到最低。目前主流的 Java Web 框架都过于复杂,如 Structs、Spring、Webwork,这些框架的用户都需要编写和维护许多配置文件,并且用这些框架的项目写法各有不同,没有统一的标准。Grails 的出现解决了这些问题,用户可以发现在 Grails 中很少去修改和添加配置文件。

Maven 简介:Maven 是一个项目管理工具,基于项目对象模型(Project Object Model),Maven 可以管理项目的构建、报告和文档的生成。Maven 主要用于用 Java 进行开发的项目。

Grails 对于 Maven 的支持:在 Grails 2.1 以前,Grails 插件必须在 BuildConfig.groovy 文件配置,对 Java 的依赖必须在 pom 文件中指定。

在 Grails 2.1 以后,对 Maven 集成的支持有了大的改进,现在 pom 文件也支持引用 Grails 插件,如清单 1:

清单 1. pom.xml 对 Grails 的支持

org.grails.plugins

hibernate

2.1.0.RC1

zip

compile

Maven 插件现在可以识别 Grails 依赖的其它插件和 Jar 包。并且 Grails 增加了一个新的命令:create-multi-project-build,这个命令在包括多个 Grails 应用或插件的目录中被调用,会生成对复杂项目的 Maven 构建。在 Grails2.1 后,对已有 Grails 项目的 Maven 管理,也只需要输入 create-pom 命令来创建项目对应的 pom 文件。

开发环境:Grails 2.1、Maven 3、JDK1.6。

单个 Grails 项目与 Maven 的集成

首先运行 create-app 命令来生成 Grails 项目,接着在 Grails 项目的根目录下用命令 create-pom 生成 POM 文件。具体实例如清单 2:

清单 2. 用命令 create-pom 生成 POM 文件#> grails create-app my-app

#> cd my-app

#> grails create-pom build.groupid

我们对上面三条命令进行简要说明,第一条是 Grails 项目的创建命令,这个命令将会以用户指定的名称来创建 Grails 应用,我们指定的名称是 my-app,所以会生成名称为 my-app 的 Grails 应用。第二条命令是进入我们创建的 my-app 的根目录下,因为第三条命令需要在 Grails 的根目录下运行。第三条命令是为 Grials 应用创建 POM 文件,使得 Grails 应用可以用 Maven 进行构建,参数 groupid 是指定应用隶属的项目。

运行 create-pom 命令后,我们可以看到在 my-app 根目录生成了文件 pom.xml, 文件显示如清单 3:

清单 3. 在 my-app 根目录生成的 pom.xml 文件<?xml version="1.0" encoding="utf-8"?>

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0

http://maven.apache.org/maven-v4_0_0.xsd">

4.0.0

build.groupid

my-app

grails-app

0.1

my-app

0.1

......

现在可以运行 mvn 的命令做简单测试,如:mvn package, 可以看到结果如清单 4:

清单 4. 运行 mvn 的命令做简单测试|Loading Grails 2.1.0

|Configuring classpath

|Running pre-compiled script

.

|Environment set to prod

.................................

|Packaging Grails application

....

|Compiling 1 source files

............

|Compiling 3 GSP files for package [myApp]

..

|Compiling 4 GSP files for package [databaseMigration]

..

|Building WAR file

..........................................

|Done creating WAR target\my-app-0.1.war

[INFO] ------------------------------------------------------------------------

[INFO] BUILD SUCCESS

[INFO] ------------------------------------------------------------------------

[INFO] Total time: 2:13.841s

[INFO] Finished at: Tue Oct 16 13:31:29 CST 2012

[INFO] Final Memory: 16M/34M

[INFO] ------------------------------------------------------------------------

从结果可以看出,我们可以使用 Maven 的命令来构建 Grails 项目。其它的 Maven 的标准命令也可以运行。例如清单 5 的命令:

清单 5. 其它的 Maven 的标准命令compile – 编译 Grails 项目

package – 构建生成 war 文件

install – 构建生成 war 文件并且将其安装在你本地的 Maven 库中

test – 运行项目的测试

clean- 清理 Grails 项目

我们对 Maven 命令执行的流程做简要说明。当在项目的根目录下输入 mvn clean package 时,maven 会将这个命令委托给 grails maven 插件来调用 grails clean 和 grails package 这两个命令。当运行这些命令时,所有的依赖来自于 Maven 的配置文件而非 Grails 的配置文件。

表 1. POM 文件内容的说明属性说明:modelVersionPOM 模型的版本,Maven2/3 的话,值为 4.0.0

groupId项目所属的组,一般项目都是由几个模块组成,所以各个模块所属的项目(组)由此参数设定。

artifactId项目在组中的定义,和 Grails 项目根目录下 application.properties 中的 app.name 名字一致。

packaging值为 grails-app,指出应用是 Grails 的应用,所以打包时会以 Grails 的应用打包。

version项目当前版本,必须和 application.properties 中的 app.version 内容一致。

name项目的名称。

description项目的描述。

properties设置 Grails 的版本号。

dependencies当运行命令 create-pom 时, grails 会基于 BuildConfig.groovy 在 POM 文件中生成项目所依赖的包,插件等。

build构建的设置。 这一部分包括了构建 Grails 项目的 Maven 插件。

repositories项目的仓库设置。 Grails 有自己的 Maven 仓库来存储插件和它的核心依赖。

profiles自定义构建环境。

Maven Archetype 的使用

上面讲的是在已有的 Grails 项目中集成 Maven,我们也可以用 maven 的 Archetype 生成 Grails maven 项目。当用 archetype 时,我们无需安装 Grails, 只需输入下面的命令,如清单 6:

清单 6. 用 maven 的 Archetype 生成 Grails mavenmvn archetype:generate -DarchetypeGroupId=org.grails

-DarchetypeArtifactId=grails-maven-archetype

-DarchetypeVersion=2.1.0

-DgroupId=example -DartifactId=my-app

使用 maven archetype 命令后,可以快速的生成项目的骨架。其中参数 DarchetypeGroupId , DarchetypeArtifactId 和 DarchetypeVersion 指定了以 Grails 2.1 的模板生成项目骨架。 DgroupId 和 DartifactId 参数指定要创建应用的 GroupId 以及 artifactId,我们没有指定应用的版本,所以当运行这个命令后,会提示输入 version。当输入提示需要输入的值并最后输入“Y“按回车键时,会生成一个新的 Maven 项目。在这个项目中会生成 POM 文件,src 文件夹以及其它文件。在生成的项目骨架中,我们看到并不像 Grails 项目的结构,所以我们需要修改 POM 文件并运行 mvn initialize 命令。

打开 my-app/pom.xml,找到 maven-compiler-plugin, 如清单 7 所示:

清单 7. 找到 maven-compiler-plugin

maven-compiler-plugin

1.51.5

我们需要将 JDK 的版本从 1.5 改为 1.6,因为我们本地安装的是 JDK1.6。然后我们输入命令 mvn initialize:如下图所示:

图 1. 输入命令 mvn initialize

32f307d8c5a01798b18e918ffa168f12.png

32f307d8c5a01798b18e918ffa168f12.png

当此命令执行完后,我们打开 my-app 目录,会发现一个完整的 grails 项目结构目录已经生成。

多模块 Grails 项目与 Maven 集成

首先创建 3 个 Grails 项目,命令如下:

图 2. 创建 3 个 Grails 的命令

c7daad49d9b2ad81a47940a96cda66fd.png

c7daad49d9b2ad81a47940a96cda66fd.png

接着我们用命令 create-multi-project-build 来使多模块项目与 Maven 集成。

图 3. 多模块项目与 Maven 集成

90036b028aff4ff68bb1edcb1998bb19.png

90036b028aff4ff68bb1edcb1998bb19.png

当此命令运行完后,在当前目录下会生成一个 pom.xml,并且在前面创建的三个项目文件夹下生成 pom.xml。

当前目录的 pom.xml 文件显示如清单 8:

清单 8. 当前目录的 pom.xml 文件<?xml version="1.0" encoding="utf-8"?>

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0

http://maven.apache.org/maven-v4_0_0.xsd">

4.0.0

org.mycompany

parent

pom

1.0

parent

myapp

plugin1

plugin2

三个子项目下的 pom.xml 文件如下,以 myapp 目录下的 pom.xml 为例:

清单 9. 当前目录的 pom.xml 文件<?xml version="1.0" encoding="utf-8"?>

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0

http://maven.apache.org/maven-v4_0_0.xsd">

4.0.0

org.mycompany

parent

1.0

..

org.mycompany

myapp

grails-app

0.1

......

首先对当前目录下的 POM 文件进行分析,从 POM 文件中可以看到 groupId, artifactId 和 version 都是用命令 create-multi-project-build 时传的参数。packaging 被设置成 pom 来指出它有子模块。modules 标签列出了所包含的子模块,因为我们前面创建了 3 个模块,所以这里列出了 3 个子模块。

下面我们对模块中的 POM 文件进行分析。

先看下 plugin1 下面的 pom.xml,在这个文件里首先是 parent 标签。Parent 标签的内容中 groupId,artifactId,version 的值和父 pom.xml 中相同。relativePath 指定了父 POM 文件的位置,所以根据这些配置可以找到父 POM 文件。Parent 标签下面是子模块的 groupId,artifactId,version 的设置,这里我们注意到 plugin 的 groupId 默认值是 org.grails.plugins。并且 packaging 的值为 grails-plugin。Plugin2 下面的 pom.xml 文件和 plugin1 下面的相似,所以不再做分析。

对于 myapp 文件夹下的 pom 文件,可以看到 parent 的值也是指向父 pom 文件。packaging 值为 grails-app,指出这是 Grails 的应用。在此 POM 文件中,我们会发现 dependency 有下面的设置:

清单 10. 当前目录的 pom.xml 文件

org.grails.plugins

plugin1

0.1

zip

compile

org.grails.plugins

plugin2

0.1

zip

compile

这里的设置指定了 myapp 依赖于 plugin1 和 plugin2。

下面我们运行 mvn install 来进行测试,可以看到构建的顺序,先根据当前目录下 parent 的值为 pom 知道这个是多模块的构建,然后去查找子模块的 pom.xml,根据子模块的 pom 文件进行构建。由于子模块 myapp 依赖于 plugin1 和 plugin2,所以 plugin1 和 plugin2 会先被构建。

图 4. 构建 plugin1 和 plugin2

b907373c3904a7a108ac6848b5e92101.png

b907373c3904a7a108ac6848b5e92101.png

Grails Plugin 与 Maven 集成

这里我们对 grails plugin 的构建做一下简要说明。Plugin 创建时用命令 grails create-plugin plugin_name, 创建 pom 文件的命令和一般应用相同,都是 create-pom。对于 pom 文件,主要的区别是 packaging 的值不同。plugin 的值为 grails-plugin,app 的值为 grails-app。这个设置使得 plugin 在构建时会调用其对应的构建命令。

Grails 插件可以被安装在其它应用中。如果我们用 IDE 打开 Grails 项目,可以看到在 Plugins 目录下,默认已经安装了 cache、hibernate、jquery、resources 等插件。

总结

通过本文对 Grails 与 Maven 集成的介绍,可以看到 Grails 项目创建完成后,开发者如何用 Maven 来进行构建。目前大多数的 Java 项目会采用 Maven 进行构建管理,所以当 Grails 项目模块是整个项目的一部分时,采用 Maven 对 Grails 项目进行统一管理,会使得对整个项目的构建管理一致。一般在单个 Grails 项目时,会采用 Grails 自身的构建机制进行构建。

相关主题Grails 官方网站:对 Grails 框架的各个组成部分有详细的说明。

Maven 官方网站:对 Maven 的基础概念及如何使用有详细的说明。

developerWorks Java 技术专区:这里有数百篇关于 Java 编程各个方面的文章。


http://chatgpt.dhexx.cn/article/sMTbhl6E.shtml

相关文章

Grails4.0.11入门

文章目录 Grails4.0.11介绍相关依赖入门⎮Java环境搭建⎮Grails环境搭建⎮如何创建grails应用⎮如何选择开发工具IDEA如何导入Grails项目 ⎮目录结构&#xff0c;约定优于配置⎮如何部署Grails项目1. 使用默认内嵌的Tomcat8部署2. 使用外部Tomtcat8部署3. 使用外部Tomcat7部署 …

grails java_Grails

十二、Grails 如今的Java Web开发对于需求来说已经变得过于复杂。当今众多Java领域的Web开发框架不仅使用复杂&#xff0c;而且并没有很好的遵循Don’t Repeat Yourself(DRY)原则。像Rails&#xff0c;Django和TurboGears这样的动态框架在Web开发领域开辟了一条新的道路&#x…

JAVA AIO编程

Asynchronous IO&#xff1a; 异步非阻塞的编程方式 与NIO不同&#xff0c;当进行读写操作时&#xff0c;只须直接调用API的read或write方法即可。这两种方法均为异步的&#xff0c;对于读操作而言&#xff0c;当有流可读取时&#xff0c;操作系统会将可读的流传入read方法的缓…

java aio_Java AIO详解

JDK1.7升级了NIO类库&#xff0c;升级后的NIO类库被称为NIO 2.0。 Java正式提供了异步文件I/O操作&#xff0c;同时提供了与UNIX网络编程事件驱动I/O对应的AIO。 AIO编程 NIO 2.0引入了新的异步通道的概念&#xff0c;并提供了异步文件通道和异步套接字通道的实现。 异步通道获…

Java I/O 模型之 AIO

❤️ 个人主页&#xff1a;水滴技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; &#x1f338; 订阅专栏&#xff1a;Java 教程&#xff1a;从入门到精通 大家好&#xff0c;我是水滴~~ 文章目录 服务端API创建服务端套接字的异步通道接…

如何用AIO技术提高程序性能

写在前面 这是一篇关于 AIO 的文章。本篇文章详细对比了几个常见的I/O模型&#xff0c;并且介绍了AIO相关的一些API。 我把英文原文翻译过来整理成这篇文章。目的一个是自己学习&#xff0c;一个是方便不习惯看英文资料的同学进行学习。 英文原文地址&#xff1a; https://…

08【AIO编程】

八、AIO编程 8.1 AIO编程简介 8.1.1 AIO编程概述 AIO也叫异步非阻塞&#xff0c;JDK1.7之后的新特性&#xff0c;AIO引入异步通道的概念&#xff0c;采用了 Proactor 模式&#xff0c;简化了程序编写&#xff0c;有效的请求才启动线程&#xff0c;它的特点是先由操作系统完成…

linux aio进程简介,Linux AIO机制

Linux的I/O机制经历了一下几个阶段的演进&#xff1a; 1. 同步阻塞I/O: 用户进程进行I/O操作&#xff0c;一直阻塞到I/O操作完成为止。 2. 同步非阻塞I/O: 用户程序可以通过设置文件描述符的属性O_NONBLOCK&#xff0c;I/O操作可以立即返回&#xff0c;但是并不保证I/O操作成功…

关于aio

AIO 是异步非阻塞 同步意味着&#xff0c;在进行读写操作时&#xff0c;线程需要等待结果&#xff0c;还是相当于闲置 异步意味着&#xff0c;在进行读写操作时&#xff0c;线程不必等待结果&#xff0c;而是将来由操作系统来通过回调方式由另外的线程来获得结果 AIO的read方…

linux AIO

AIO 是 Linux 下的异步读写模型&#xff0c;它是 2.6 内核提供的一个标准增强特性。对于文件的读写&#xff0c;即使以 O_NONBLOCK 方式来打开一个文件&#xff0c;也会处于 “阻塞” 状态&#xff0c;因为文件时时刻刻处于可读状态&#xff0c;而从磁盘到内存所等待的时间是惊…

AIO模型

目录 AIO模型介绍 AsynchronousServerSocketChannel&#xff1a;AIO中网络通信服务端的socket 1、future方法 2、callback回调方式 AIO 的回调方式编程 BIO、NIO、AIO的比较 1、释义 BIO&#xff1a;同步阻塞IO模型 NIO&#xff1a;同步非阻塞IO模型 AIO&#xff1a;…

java中IO模型-AIO模型

AIO模型介绍 AIO&#xff08;Asynchronous I/O&#xff09; 异步非阻塞模型&#xff0c; 在javajdk.17版本开始支持AIO&#xff0c;AIO模型需要操作系统的支持。 AIO最大的特性是异步能力&#xff0c;对socket和I/O起作用。 异步IO模型类似的 与NIO模型不同&#xff0c;读写操…

架构解密从分布式到微服务:深入理解网络,AIO

AIO AIO是I/O模型里一个很高的层次&#xff0c;体现了大道至简的软件美学理念。与NIO相比&#xff0c;AIO的框架和使用方法相对简单很多。 AIO包括两大部分:AIO Files解决了文件的异步处理问题&#xff0c;AIO Sockets解决了Socket的异步处理问题。AIO的核心概念为应用发起非…

BIO,NIO,AIO区别

BIO,NIO,AIO 总结 Java 中的 BIO、NIO和 AIO 理解为是 Java 语言对操作系统的各种 IO 模型的封装。程序员在使用这些 API 的时候&#xff0c;不需要关心操作系统层面的知识&#xff0c;也不需要根据不同操作系统编写不同的代码。只需要使用Java的API就可以了。 在讲 BIO,NIO,…

Apache CXF - 快速指南

Apache CXF - 简介 在当今的环境中&#xff0c;您可以使用多个选项来创建 Web 服务应用程序。您可以使用多种标准和广泛接受的协议中的一种或多种进行通信。例如SOAP、XML/HTTP、RESTful HTTP和CORBA&#xff08;通用对象请求代理架构&#xff0c;在过去非常流行&#xff0c;但…

java cxf 安全_CXF client在并发下的线程安全问题

这个是发生在上周周末的真实案例&#xff0c;因为cxf client 端线程安全导致的错误&#xff0c;总结出来希望其他使用cxf的兄弟注意。 首先描述一下背景&#xff0c;简单的说就是使用cxf作为web service的客户端&#xff0c;运行在weblogic上&#xff0c;连接外部的服务器。为了…

linux cxf服务端,Apache CXF 框架应用实战

一、概述 Apache CXF提供了用于方便地构建和开发WebService的可靠基础架构。它允许创建高性能和可扩展的服务&#xff0c;可以部署在Tomcat和基于Spring的轻量级容器中&#xff0c;也可以部署在更高级的服务器上&#xff0c;例如Jboss、WebSphere或WebLogic。 CXF提供了以下功能…

使用CXF调用WSDL

简介 时隔多年&#xff0c;再次遇到需要调用WebService的业务&#xff0c;对方给予的wsdl说明文档还是内网的链接&#xff0c;并且设有基础访问权限&#xff0c;即在浏览器打开wsdl链接时需要输入【用户名密码】登录后方可查看wsdl文档&#xff0c;这需要设置代理&#xff08;我…

spring5.x cxf3.4.x 服务端和客户端 非maven版本

文章目录 一、资料准备1. 官网链接2. 解压3. 依赖梳理 二、spring集成cxf2.1.创建spring项目2.2. 创建接口2.3. impl2.4. spring-cxf.xml2.5. 客户端2.6. 开源项目 一、资料准备 1. 官网链接 http://cxf.apache.org/download.html 下载apache-cxf-3.4.5.zip 2. 解压 3. 依赖…

CXF实现WebService

一、CXF简介 Apache CXF Celtix XFire&#xff0c;开始叫 Apache CeltiXfire&#xff0c;后来更名为 Apache CXF 了&#xff0c;以下简称为 CXF。CXF 继承了 Celtix 和 XFire 两大开源项目的精华&#xff0c;提供了对 JAX-WS 全面的支持&#xff0c;并且提供了多种 Binding …