Grapeã䜿ã£ãŠã¡ãã£ãšããã£ãããšã«ã€ããŠãTwitterãšãã§ãã©ãã©èŠãããŠããã®ã§ããããæ©ã«èªåãå°ããŸãšããŠãããŸãã
ããã¡ãªã¿ã«ãå¥ã«Grapeããªã«ã貶ãããããã§ã¯ãªãããããèªåã¯ããGrapeã䜿ã£ãŠãã人ã§ãã®ã§ãGrapeã®äŸ¿å©ãã¯ãGroovyã䜿ã£ãŠãã倧ããªçç±ã«ä»ãªããŸããã
ãã ãŸããåããããªçç±ã§ãããæ¹ãããã£ããã£ãå Žåã®ãäœãã®åèã«ãªãã°ãšã
èªåãéå»ã«ããã£ãïŒãããã¯èŠãããïŒã®ã¯ã以äžã®ã±ãŒã¹ã§ãã
- Groovyèªèº«ã«å«ãŸããŠããã©ã€ãã©ãªãšè¡çªãã
- ã¢ãŒãã£ãã¡ã¯ããªã©ã®æå®ãåçã«ã¯ã§ããªã
- groovycã§ã³ã³ãã€ã«ããŠjavaã³ãã³ãã§å®è¡ããã®ã¯ãè«Šããæ¹ããããã
- Grabã¢ãããŒã·ã§ã³ã§æå®ããäŸåé¢ä¿ããäžéšè§£æ±ºã§ããã«å€±æãã
- Grapeãåç §ããMavenãªããžããªãã埮åŠã«äžå®å š
æåŸã®ã¯ããã£ããæè¿ã«ééããã±ãŒã¹ã§ãããäŸåé¢ä¿ãäžéšè§£æ±ºã§ããªããšããã®ã¯ãä»äºã§ééããã®ã§ãããèªå® ã§å床確èªããããåçŸããŸããã§ããâŠã
ãŸãããšããããèŒããŠãã£ãŠã¿ãŸãããã
Groovyèªèº«ã«å«ãŸããŠããã©ã€ãã©ãªãšè¡çªãã
以åãçµã¿èŸŒã¿Tomcatã§éãŒããšããŠã以äžã®ãããªããã°ã©ã ãæžããŸããã
embedded_tomcat.groovy
import javax.servlet.http.HttpServlet import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletResponse @Grapes([ @Grab('org.apache.tomcat:tomcat-catalina:7.0.42'), @Grab('org.apache.tomcat.embed:tomcat-embed-core:7.0.42'), @Grab('org.apache.tomcat:tomcat-jasper:7.0.42'), @GrabConfig(systemClassLoader=true, initContextClassLoader=true) ]) import org.apache.catalina.startup.Tomcat def tomcat = new Tomcat() tomcat.port = 8080 // tomcat.connector.useBodyEncodingForURI = true def context = tomcat.addWebapp('/', '.') Tomcat.addServlet(context, 'simpleServlet', new SimpleServlet()) context.addServletMapping('/simpleServlet', 'simpleServlet') tomcat.start() tomcat.server.await() // tomcat.stop() class SimpleServlet extends HttpServlet { // ãçç¥ïŒç°¡åãªServletããã°ã©ã ïŒã }
ïŒéå»ã®ãã®ããã®ãŸãŸäœ¿ã£ãã®ã§ãTomcatãå€ãã®ã¯ãæå¬ã
åäœãããããã«ã¯ãwebappsãã£ã¬ã¯ããªãå¿ èŠãªãããªã®ã§ãã«ã¬ã³ããã£ã¬ã¯ããªã«
$ mkdir -p tomcat.8080/webapps
ãå®è¡ããŠäœæããŠãããŸãã
ã§ãå®è¡ã
$ groovy embedded_tomcat.groovy
ãšããããããã¯ç倧ã«ã³ã±ãŸããã¹ã¿ãã¯ãã¬ãŒã¹ãªã©ã¯ç«¯æããŸããããã®æã¯ããããèŠããšã以äžã®ãããªãã®ãå«ãŸããŠããŸããã
Caused by: java.lang.NoSuchMethodError: javax.servlet.ServletContext.getSessionCookieConfig()Ljavax/servlet/SessionCookieConfig;
NoSuchMethodErrorïŒServletContextã«Servlet 3.0ã§è¿œå ãããã¡ãœããããããã£ãŠããªãããã§ãããã¯ãŠãTomcatã«å«ãŸããŠããServlet APIã¯ã©ãããããšã§ãããïŒ
ïŒäžå¿ãæ°ããããŒãžã§ã³ã®Tomcatãè©ŠããŠã¿ãŸãããã©ããšã©ãŒãå°ãå€ãã£ãNoSuchMethodErrorãåºãŸãã
èŠãçŽãã«ãããªã®ãå ¥ããŠããŸãããå¹æãªãã
@GrabConfig(systemClassLoader=true, initContextClassLoader=true)
ã§ãåé¡ã®ServletContextã誰ããããŒããããŠããã®ããã¡ãã£ãšç¢ºèªããŠã¿ãŸããã
println(javax.servlet.ServletContext.class.classLoader.getResource('javax/servlet/ServletContext.class'))
çµæããã¡ãããã
jar:file:/[HOMEãã£ã¬ã¯ããª]/.gvm/groovy/current/lib/servlet-api-2.4.jar!/javax/servlet/ServletContext.class
ã€ãŸããGroovyã«å ¥ã£ãŠããServlet APIãèŠãŠããŸããããšããããServlet API 2.4ãªãã§ããããŒã
Groovyã«å«ãŸããŠããJARãã©ããã«éé¿ããã°èµ·åããããã«ãªããŸããããããã察åŠãã¡ãã£ãšãªãã§ãããããã®ããã«Groovyã«å«ãŸããŠããJARãšè¡çªããŠã©ãã«ããªããªãå Žåã¯ãGradleãšãã«è¡ã£ãæ¹ãè¯ãããã§ãã
ã¢ãŒãã£ãã¡ã¯ããªã©ã®æå®ãåçã«ã¯ã§ããªã
Gradleã§äœ¿ãããããã«ãGrabã§æå®ããããŒãžã§ã³ããŸãšãããããããšããŠGStringã䜿çšãã以äžã®å®çŸ©ãæžããš
def version = '3.3.2' @Grab("org.apache.commons:commons-lang3:$version") import org.apache.commons.lang3.StringUtils println(StringUtils.join(['Hello', 'World'], ', '))
以äžã®ããã«ãšã©ãŒã«ãªããŸãã
The missing attribute "group" is required in @Grab annotations at line: 2, column: 1
ãããGStringã®è©äŸ¡ã®åã«ASTå€æããããã®ã§ãGrabã¢ãããŒã·ã§ã³ååã§æå®ãããŠããå¿ èŠããããã§ãããããâŠã
ã¡ãªã¿ã«ãããããæžãæ¹ããã¡ã§ãã
def version = '3.3.2' @Grab('org.apache.commons:commons-lang3:' + version)
ããã«èšããšãããããã®ããã¡ã§ãã
def ver = '3.3.2' @Grab(group = 'org.apache.commons', module = 'commons-lang3', version = ver)
ãã®å Žåã¯ã
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: /path/to/script.groovy: 4: Attribute "version" has value ver but should be an inline constant in @Grab annotations @ line 4, column 1. @Grab(group = 'org.apache.commons', module = 'commons-lang3', version = ver) ^
ãšæãããŸãã
groovycã§ã³ã³ãã€ã«ããŠjavaã³ãã³ãã§å®è¡ããã®ã¯ãè«Šããæ¹ããããã
解決ã§ããªãã£ããã¿ã§ãã
@Grabã¢ãããŒã·ã§ã³ã䜿ã£ãã¹ã¯ãªããããgroovycã§ã³ã³ãã€ã«ããŠjavaã³ãã³ãã§å®è¡ãããã®ã¯è«Šããæ¹ããããã§ãã
That darned "No suitable ClassLoader found for grab" with groovyc and java -cp
http://www.randomactsofsentience.com/2012/01/that-darned-no-suitable-classloader.html
ã¯ã©ã¹ããŒããŒãGrapeã®åæåãŸããã§ãšã©ãŒã«ãªãã®ã§ãGrapeã䜿ãå Žåã¯groovyã³ãã³ãã§ã¹ã¯ãªããçã«äœ¿çšããã±ãŒã¹ãšå²ãåã£ãæ¹ãå®å šããã§ãã
Grabã¢ãããŒã·ã§ã³ã§æå®ããäŸåé¢ä¿ããäžéšè§£æ±ºã§ããã«å€±æãã
ããã¯ãHTTPBuilderã䜿ã£ãŠããŠããã£ãããšããããŸãã
Groovyã®HTTPBuilderã§ãmultipart/form-dataãéä¿¡ãã
http://d.hatena.ne.jp/Kazuhira/20140126/1390708336
åœæãHTTPBuilderã䜿çšããæã«ãããªæãã«æžããšã
@Grab('org.codehaus.groovy.modules.http-builder:http-builder:0.6')
以äžã®ãããªãšã©ãŒãããã£ãŠããã£ãŠããŸããã
org.codehaus.groovy.control.MultipleCompilationErrorsException
ã§ããã®æããŸããã£ãŠããªãã£ãã®ã¯ãäŸåããŠããcommons-codecãååŸã§ããã«å€±æããŠããŸããããšã
ãã®æã¯ãcommons-codecãExcludeããŠããèªåã§è¿œå ãããšããªããšãåããŸããã
@Grab('commons-codec:commons-codec:1.9') @Grab('org.codehaus.groovy.modules.http-builder:http-builder:0.6') @GrabExclude('commons-codec:commons-codec')
ãªãã§ããã©ãä»ã®èªå® ç°å¢ã§ã¯ããŸãåçŸããïŒããšããšãäŒç€Ÿã®ç°å¢ã§èŠã€ããã®ã§âŠïŒã
åãæ¡ä»¶ã§ããã£ãŠããæ¹ãèŠãããããšãããã®ã§ãäœãåå ããããã§ããããã©ããã®æã¡ãããšè¿œããããŠå ¥ãã°ããã£ãããªãŒãšæã£ãŠããŸãã
ãªãã§ããããããããã次ã«æãããã®ã«é¢é£ããŠããã®ãããããŸãããã
Grapeãåç §ããMavenãªããžããªãã埮åŠã«äžå®å š
ããã¯ã@eiryuãããããã£ãŠããã®ãäžç·ã«è¿œãããããã¿ã§ããã
Grapeã®äŸåæ§è§£æ±ºã«å€±æããŠjcenterã«åãåããã話
http://eiryu.hatenablog.com/entry/20140430/1398874534
Failed resolving by Groovy's Grape
https://github.com/making/ltsv4j/issues/1
Grapeãåç §ãããªããžããªã®ãã¡ã®ã²ãšã€ã§ãããJCenterã«pom.xmlã¯ããã®ã«JARãã¡ã€ã«ãååšãããIvyãäŸåé¢ä¿ã解決ã§ããªããªããããç¶ããŠããŸããšãããã¿ãŒã³ã
ããšããšãGrapeã®äŸåé¢ä¿ã®è§£æ±ºé ã¯
1. Grape's local cache
2. Maven local cache
3. Codehaus Maven repo
4. Maven Central
5. Java.net Maven repo
ã ã£ããããã®ã§ãããGroovy 2.1.8ãã以äžã®ããã«JCenterãè¿œå ãããããã§ãã
[GROOVY-6380] Improve Grapes resolution speed and stability by adding Bintray JCenter as first remote resolver in the chain
http://jira.codehaus.org/browse/GROOVY-6380
Codehausã®ãªããžããªãé ããæåãªã©ã€ãã©ãªããããŸãå ¥ã£ãŠããªãããšãããšããããè¿œå ããããªããžããªã®ããã§ãã
ãšããããã§ãä»ã®ïŒGroovy 2.1.8ãå°ãªããšã2.2.2ïŒGrapeã®ããã©ã«ãã®äŸåé¢ä¿ã®è§£æ±ºé ã¯
1. Grape's local cache
2. Maven local cache
3. Bintray's JCenter
4. Codehaus Maven repo
5. Maven Central
6. Java.net Maven repo
ãšãªããŸãã
ãªãã§ãããå ã®@eiryuããã®ãšã³ããªã«èŒããŠããltsv4jã¯ãJCenterã«ã¯pom.xmlãããªããJARãã¡ã€ã«ãååšããªãç¶æ ã§ããã
ãªã®ã§ãäºæ³ãšããŠã¯âŠ
- äŸåé¢ä¿ã解決ããéã®ãæåã®ã«ãã¯ã¢ããå ã§Ivyãpom.xmlãèŠã€ãã
- pom.xmlã¯èŠã€ãããã®ã®ãJARããªãããããã§è«Šãã
JARãèŠã€ãããªããã°ã次ã®ãªããžããªãžè¡ãâŠãªããŠåäœã¯ããªããšæããŸãã®ã§ãããã§å»¶ã ãšããã£ãŠããã®ããã®æã®äºè±¡ãšæãããŸãã
ãããªã£ãŠããŸããšãæšæºçã«Grapeã䜿ã£ãŠãããšãã€ãŸã§ã解決ã§ããŸããã
ã¡ãªã¿ã«ããããã°ã¯åæ¹
$ grape -V install <group> <module> <version>
ã
$ groovy -Dgroovy.grape.report.downloads=true -Divy.message.logger.level=4 <ã¹ã¯ãªããå>
ãªã©ã§ãã£ãŠããŸããã
ã§ãã©ã解決ãããïŒ
解決çã¯ã以äžããããèããããŸãã
- åé¡ã®ããMavenãªããžããªãä¿®æ£ããŠãããïŒäžèšã®å Žåã¯ãJCenterïŒ
- Mavenã§ãããããããŠã³ããŒãããŠããïŒæªæ€èšŒâŠïŒ
- åé¡ã®ããMavenãªããžããªãGrapeã®åç §å ãã解é€ãã
æåã®ãåé¡ã®ããMavenãªããžããªãä¿®æ£ããŠããããããä»åã®è§£æ±ºæ¹æ³ãšãªããŸããããªããšããªããžããªåŽã«äŸé ŒããŠå¯Ÿå¿ããŠãããããšã¯âŠã
ã§ãæªæ€èšŒã§ããGrapeã§ã¯ãªããŠMavenã§ãããããããŠã³ããŒãããŠããã°ãäŸåé¢ä¿ã®è§£æ±ºæã®ã«ãã¯ã¢ããå ã«Mavenã®ããŒã«ã«ãªããžããªãå ¥ã£ãŠããã®ã§ããªããšããªãã®ã§ã¯ãªãããªãŒãšæã£ãŠããŸãã
æåŸããåé¡ã®ããMavenãªããžããªãGrapeã®åç §å ãã解é€ãããã§ããããã¡ãã¯èªåãåã£ãæ¹æ³ã§ãã
以äžã®ãã¹ã«Grapeã®èšå®ãGitHubãªãããã³ããŒããŠããŠãä»åã®å Žåã¯JCenterãåé€ãããšMaven CentralãŸã§æµããããã«ãªããŸãã
$HOME/.groovy/grapeConfig.xml
Maven Centralãªã©ã«ã¢ãŒãã£ãã¡ã¯ããããå Žåã¯ãããã§è§£æ±ºããããšãã§ããŸãã
âŠãªãã§ããã©ãæåŸã®2ã€ã®æ¹æ³ã¯Groovyã¹ã¯ãªããã®ããŒã¿ããªãã£ããªããªãã®ã§ãããŸãæ¬è³ªçãªè§£æ±ºçã§ã¯ãããŸãããã§ããã°ããªããžããªåŽãäžéå端ãªç¶æ ã«ãªããªãããã«ããŠããã ããããšããã§ããã
é床ã¢ããã®ããã«JCenterãè¿œå ãããããªã®ã§ããããŸããã©ãã«ãåºãŠããŸããšã埮åŠã§ãããâŠã
ãã®ä»ããããã©ãããèŠã€ãããããŸãè¿œèšããŸããã