{"id":266,"date":"2009-02-15T15:37:47","date_gmt":"2009-02-15T18:37:47","guid":{"rendered":"https:\/\/devkico.itexto.com.br\/?p=266"},"modified":"2009-02-16T08:45:44","modified_gmt":"2009-02-16T11:45:44","slug":"grails-entendendo-a-estrutura-de-diretorios","status":"publish","type":"post","link":"https:\/\/devkico.itexto.com.br\/?p=266","title":{"rendered":"Grails: entendendo a estrutura de diret\u00f3rios"},"content":{"rendered":"<p><a href=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/02\/diretoriosgrails_jpg.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-268\" style=\"margin: 10px;\" title=\"diretoriosgrails_jpg\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/02\/diretoriosgrails_jpg.jpg\" alt=\"\" width=\"192\" height=\"369\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/02\/diretoriosgrails_jpg.jpg 192w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/02\/diretoriosgrails_jpg-156x300.jpg 156w\" sizes=\"(max-width: 192px) 100vw, 192px\" \/><\/a> Se voc\u00ea deseja conhecer o Grails, a primeira coisa que dever\u00e1 conhecer BEM consiste em sua estrutura de diret\u00f3rios. Esta \u00e9 criada ap\u00f3s a execu\u00e7\u00e3o do comando<\/p>\n<p>grails create-app [nome da sua aplica\u00e7\u00e3o]<\/p>\n<p>dentro do diret\u00f3rio [nome da sua aplica\u00e7\u00e3o]. A primeira vista, pode parecer um pouco complexa, por\u00e9m, como veremos neste post, \u00e9 incr\u00edvelmente simples de ser compreendida e, uma vez assimilada, tornar\u00e1 n\u00edtido o conceito de programa\u00e7\u00e3o baseada em conven\u00e7\u00f5es.<\/p>\n<p>(Neste post n\u00e3o irei explicar o que s\u00e3o os arquivos expostos na imagem (ser\u00e3o assunto para um post futuro), sendo assim, foquemo-nos apenas ao que interessa: os diret\u00f3rios)<\/p>\n<p>Comecemos portanto pelos diret\u00f3rios presentes na raiz de nossa aplica\u00e7\u00e3o:<\/p>\n<p><strong>grails-app:<\/strong> cont\u00e9m o que realmente interesssa, ou seja, a sua aplica\u00e7\u00e3o. 99% das classes que voc\u00ea venha a criar para a mesma dever\u00e3o estar contidas em um dos subdiret\u00f3rios presentes nesta entrada.<\/p>\n<p><strong>grails-app\/conf:<\/strong> armazena arquivos de configura\u00e7\u00e3o da sua aplica\u00e7\u00e3o, como por exemplo acesso a banco de dados e a configura\u00e7\u00e3o do Spring ou Hibernate.<\/p>\n<p><strong>grails-app\/controllers:<\/strong> todas as suas classes de controle ser\u00e3o inclu\u00eddas neste diret\u00f3rio<\/p>\n<p><strong>grails-app\/domain:<\/strong> as classes de dom\u00ednio de sua aplica\u00e7\u00e3o (aquelas que ser\u00e3o persistidas no banco de dados e cont\u00e9m sua l\u00f3gica de neg\u00f3cio)<\/p>\n<p><strong>grails-app\/i18n:<\/strong> recursos de internacionaliza\u00e7\u00e3o para a sua aplica\u00e7\u00e3o<\/p>\n<p><strong>grails-app\/services:<\/strong> armazena os &#8220;servi\u00e7os&#8221; de sua aplica\u00e7\u00e3o. O que v\u00eam a ser um servi\u00e7o? Grails incentiva o desenvolvedor a n\u00e3o incluir toda a sua l\u00f3gica de neg\u00f3cios nas classes de dom\u00ednio (por favor, n\u00e3o as inclua (nem um pedacinho!) nos controladores). As classes de servi\u00e7o s\u00e3o gerenciadas pelo Spring, e s\u00e3o respons\u00e1veis portanto por encapsular determinados aspectos da l\u00f3gica de neg\u00f3cios de sua aplica\u00e7\u00e3o.<\/p>\n<p><strong>grails-app\/taglib:<\/strong> armazena todas as tags customizadas criadas usando o Grails (mais sobre isto em um post futuro, aonde voc\u00ea ficar\u00e1 boquiaberto com a facilidade que Grails nos tr\u00e1s nesta tarefa)<\/p>\n<p><strong>grails-app\/utils:<\/strong> neste diret\u00f3rio ser\u00e3o armazenadas classes utilit\u00e1rias para sua aplica\u00e7\u00e3o, como por exemplo codecs de strings e classes utilizadas por alguns plugins oferecidos para o Grails.<\/p>\n<p><strong>grails-app\/views:<\/strong> cont\u00e9m todos os arquivos GSP respons\u00e1veis por renderizar as p\u00e1ginas utilizadas pela sua aplica\u00e7\u00e3o. Cada classe de dom\u00ednio possui um diret\u00f3rio equivalente dentro deste diret\u00f3rio. Suponha por exemplo que exista uma classe de dom\u00ednio chamada Livro. Seguindo as conven\u00e7\u00f5es do Grails, dever\u00e1 existir tamb\u00e9m (caso esta classe venha a necessitar de uma camada de visualiza\u00e7\u00e3o) um diret\u00f3rio chamado grails-app\/views\/livro.<\/p>\n<p><strong>lib:<\/strong> neste diret\u00f3rio dever\u00e3o ser inclu\u00eddos todos os arquivos .jar referentes a bibliotecas terceirizadas que voc\u00ea queira utilizar, como por exemplo drivers JDBC, bibliotecas para gera\u00e7\u00e3o de PDF e, principalmente, seu c\u00f3digo legado, caso seja necess\u00e1rio reaproveit\u00e1-lo.<\/p>\n<p><strong>scripts: <\/strong>caso seja necess\u00e1ria a cria\u00e7\u00e3o de novos scripts para facilitar o desenvolvimento da sua aplica\u00e7\u00e3o, os mesmos dever\u00e3o ser inclu\u00eddos neste diret\u00f3rio. Todos os scripts usados pelo Grails s\u00e3o desenvolvidos usando GANT (Groovy Ant), que consiste em uma camada de abstra\u00e7\u00e3o para o Ant feita em Groovy.<\/p>\n<p><strong>src:<\/strong> No diret\u00f3rio src voc\u00ea pode armazenar c\u00f3digo fonte a ser reaproveitado por sua aplia\u00e7\u00e3o. Normalmente, consiste em c\u00f3digo fonte legado que n\u00e3o se encaixa f\u00e1cilmente na estrutura de diret\u00f3rios proposta pelo Grails. Dentro deste diret\u00f3rio h\u00e1 dois outros: groovy e java, aonde \u00e9 poss\u00edvel armazenar c\u00f3digo fonte das duas linguagens.<\/p>\n<p><strong>test:<\/strong> armazena todos os seus testes unit\u00e1rios, funcionais e de integra\u00e7\u00e3o<\/p>\n<p><strong>web-app:<\/strong> O conte\u00fado est\u00e1tico de sua aplica\u00e7\u00e3o, como por exemplo arquivos html, imagens, css, etc.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Se voc\u00ea deseja conhecer o Grails, a primeira coisa que dever\u00e1 conhecer BEM consiste em sua estrutura de diret\u00f3rios. Esta \u00e9 criada ap\u00f3s a execu\u00e7\u00e3o do comando grails create-app [nome da sua aplica\u00e7\u00e3o] dentro do diret\u00f3rio [nome da sua aplica\u00e7\u00e3o]. A primeira vista, pode parecer um pouco complexa, por\u00e9m, como veremos neste post, \u00e9 incr\u00edvelmente [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[3,30,5],"tags":[],"class_list":["post-266","post","type-post","status-publish","format-standard","hentry","category-grails","category-grails-guia-rapido-e-indireto","category-groovy"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Grails: entendendo a estrutura de diret\u00f3rios - \/dev\/Kico<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/devkico.itexto.com.br\/?p=266\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Grails: entendendo a estrutura de diret\u00f3rios - \/dev\/Kico\" \/>\n<meta property=\"og:description\" content=\"Se voc\u00ea deseja conhecer o Grails, a primeira coisa que dever\u00e1 conhecer BEM consiste em sua estrutura de diret\u00f3rios. Esta \u00e9 criada ap\u00f3s a execu\u00e7\u00e3o do comando grails create-app [nome da sua aplica\u00e7\u00e3o] dentro do diret\u00f3rio [nome da sua aplica\u00e7\u00e3o]. A primeira vista, pode parecer um pouco complexa, por\u00e9m, como veremos neste post, \u00e9 incr\u00edvelmente [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/devkico.itexto.com.br\/?p=266\" \/>\n<meta property=\"og:site_name\" content=\"\/dev\/Kico\" \/>\n<meta property=\"article:published_time\" content=\"2009-02-15T18:37:47+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2009-02-16T11:45:44+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.itexto.net\/devkico\/wp-content\/uploads\/2009\/02\/diretoriosgrails_jpg.jpg\" \/>\n<meta name=\"author\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@loboweissmann\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=266\",\"url\":\"https:\/\/devkico.itexto.com.br\/?p=266\",\"name\":\"Grails: entendendo a estrutura de diret\u00f3rios - \/dev\/Kico\",\"isPartOf\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=266#primaryimage\"},\"image\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=266#primaryimage\"},\"thumbnailUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/02\/diretoriosgrails_jpg.jpg\",\"datePublished\":\"2009-02-15T18:37:47+00:00\",\"dateModified\":\"2009-02-16T11:45:44+00:00\",\"author\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\"},\"breadcrumb\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=266#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/devkico.itexto.com.br\/?p=266\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=266#primaryimage\",\"url\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/02\/diretoriosgrails_jpg.jpg\",\"contentUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/02\/diretoriosgrails_jpg.jpg\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=266#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/devkico.itexto.com.br\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Grails: entendendo a estrutura de diret\u00f3rios\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\",\"url\":\"https:\/\/devkico.itexto.com.br\/\",\"name\":\"\/dev\/Kico\",\"description\":\"Desenvolvendo software\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/devkico.itexto.com.br\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\",\"name\":\"Kico (Henrique Lobo Weissmann)\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"caption\":\"Kico (Henrique Lobo Weissmann)\"},\"sameAs\":[\"https:\/\/x.com\/loboweissmann\"],\"url\":\"https:\/\/devkico.itexto.com.br\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Grails: entendendo a estrutura de diret\u00f3rios - \/dev\/Kico","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/devkico.itexto.com.br\/?p=266","og_locale":"pt_BR","og_type":"article","og_title":"Grails: entendendo a estrutura de diret\u00f3rios - \/dev\/Kico","og_description":"Se voc\u00ea deseja conhecer o Grails, a primeira coisa que dever\u00e1 conhecer BEM consiste em sua estrutura de diret\u00f3rios. Esta \u00e9 criada ap\u00f3s a execu\u00e7\u00e3o do comando grails create-app [nome da sua aplica\u00e7\u00e3o] dentro do diret\u00f3rio [nome da sua aplica\u00e7\u00e3o]. A primeira vista, pode parecer um pouco complexa, por\u00e9m, como veremos neste post, \u00e9 incr\u00edvelmente [&hellip;]","og_url":"https:\/\/devkico.itexto.com.br\/?p=266","og_site_name":"\/dev\/Kico","article_published_time":"2009-02-15T18:37:47+00:00","article_modified_time":"2009-02-16T11:45:44+00:00","og_image":[{"url":"http:\/\/www.itexto.net\/devkico\/wp-content\/uploads\/2009\/02\/diretoriosgrails_jpg.jpg"}],"author":"Kico (Henrique Lobo Weissmann)","twitter_card":"summary_large_image","twitter_creator":"@loboweissmann","twitter_misc":{"Escrito por":"Kico (Henrique Lobo Weissmann)","Est. tempo de leitura":"3 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/devkico.itexto.com.br\/?p=266","url":"https:\/\/devkico.itexto.com.br\/?p=266","name":"Grails: entendendo a estrutura de diret\u00f3rios - \/dev\/Kico","isPartOf":{"@id":"https:\/\/devkico.itexto.com.br\/#website"},"primaryImageOfPage":{"@id":"https:\/\/devkico.itexto.com.br\/?p=266#primaryimage"},"image":{"@id":"https:\/\/devkico.itexto.com.br\/?p=266#primaryimage"},"thumbnailUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/02\/diretoriosgrails_jpg.jpg","datePublished":"2009-02-15T18:37:47+00:00","dateModified":"2009-02-16T11:45:44+00:00","author":{"@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7"},"breadcrumb":{"@id":"https:\/\/devkico.itexto.com.br\/?p=266#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/devkico.itexto.com.br\/?p=266"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/?p=266#primaryimage","url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/02\/diretoriosgrails_jpg.jpg","contentUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/02\/diretoriosgrails_jpg.jpg"},{"@type":"BreadcrumbList","@id":"https:\/\/devkico.itexto.com.br\/?p=266#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/devkico.itexto.com.br\/"},{"@type":"ListItem","position":2,"name":"Grails: entendendo a estrutura de diret\u00f3rios"}]},{"@type":"WebSite","@id":"https:\/\/devkico.itexto.com.br\/#website","url":"https:\/\/devkico.itexto.com.br\/","name":"\/dev\/Kico","description":"Desenvolvendo software","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/devkico.itexto.com.br\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pt-BR"},{"@type":"Person","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7","name":"Kico (Henrique Lobo Weissmann)","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","caption":"Kico (Henrique Lobo Weissmann)"},"sameAs":["https:\/\/x.com\/loboweissmann"],"url":"https:\/\/devkico.itexto.com.br\/?author=1"}]}},"jetpack_featured_media_url":"","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/266"}],"collection":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=266"}],"version-history":[{"count":2,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/266\/revisions"}],"predecessor-version":[{"id":272,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/266\/revisions\/272"}],"wp:attachment":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=266"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=266"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=266"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}