{"id":237,"date":"2012-02-04T23:03:35","date_gmt":"2012-02-04T22:03:35","guid":{"rendered":"http:\/\/www.nax.cz\/?p=237"},"modified":"2012-02-04T23:03:35","modified_gmt":"2012-02-04T22:03:35","slug":"spring-roo-app-engine-even-friends-1","status":"publish","type":"post","link":"https:\/\/nax.cz\/?p=237","title":{"rendered":"spring roo + app engine => even friends (part 1)"},"content":{"rendered":"<p>Platform as a service really taking of lately (ups &#8211; last 3 years \ud83d\ude09 and I&#8217;ve decided that it is time for me to start messing around and try what is actually user experience and what frameworks to use.<\/p>\n<p>I started with simple idea &#8211; lets write an app. And because I travel a lot and I travel with friends, I decided to create another expense tracking app, but this time specialized to solve post trip sorting-out-bills-split-headache.<\/p>\n<p>First I watched a few tutorial videos like <a href=\"http:\/\/www.youtube.com\/watch?v=BdaidK2JhqI&#038;feature=BFa&#038;list=PLCE7B2E85DFEC530E&#038;lf=results_main\">this one<\/a> and installed maven (from Ubuntu repository) and roo (downloaded latest zip file &#8211; v1.2.0.RC1 [rev dcaa483]).<\/p>\n<p><code><br \/>\ncd ~\/src\/roo-projects\/<br \/>\nmkdir evenfriends<br \/>\nroo<br \/>\n<\/code><\/p>\n<p>This gives you roo console. Now lets create some data model:<br \/>\n<code><br \/>\nproject --topLevelPackage cz.nax.evenfriends<br \/>\njpa setup --provider HIBERNATE --database HYPERSONIC_IN_MEMORY<\/p>\n<p>entity jpa --class ~.domain.Currency --testAutomatically<br \/>\nfield string --fieldName code --notNull --sizeMax 3<br \/>\nfield string --fieldName rateToDolar --notNull<\/p>\n<p>entity jpa --class ~.domain.Traveler --testAutomatically<br \/>\nfield string --fieldName name --notNull<br \/>\nfield reference --fieldName homeCurrency --type  ~.domain.Currency<\/p>\n<p>entity jpa --class ~.domain.Bill --testAutomatically<br \/>\nfield string --fieldName description --notNull<br \/>\nfield reference --fieldName payedBy --type  ~.domain.Traveler<br \/>\nfield number --fieldName amount --type java.lang.Float<br \/>\nfield reference --fieldName currency --type  ~.domain.Currency<br \/>\nfield set --fieldName consumedBy --type  ~.domain.Traveler<\/p>\n<p>entity jpa --class ~.domain.Trip --testAutomatically<br \/>\nfield string --fieldName name --notNull<br \/>\nfield date --fieldName fromDate --type  java.util.Date<br \/>\nfield date --fieldName toDate --type  java.util.Date<br \/>\nfield set --fieldName bills --type  ~.domain.Bill<br \/>\nweb mvc setup<br \/>\nweb mvc all --package cz.nax.evenfriends.domain<\/p>\n<p>test integration<br \/>\nperform test<br \/>\n<\/code><\/p>\n<p>Then I got error when I tried to run <code>perform eclipse<\/code><br \/>\n<code><br \/>\n[ERROR] BUILD ERROR<br \/>\n[INFO] ------------------------------------------------------------------------<br \/>\n[INFO] Failed to resolve artifact.<br \/>\nroo><br \/>\nMissing:<br \/>\n----------<br \/>\n1) com.sun:tools:jar:1.4.2<br \/>\nroo><br \/>\n  Try downloading the file manually from the project website.<br \/>\nroo><br \/>\n  Then, install it using the command:<br \/>\n      mvn install:install-file -DgroupId=com.sun -DartifactId=tools -Dversion=1.4.2 -Dpackaging=jar -Dfile=\/path\/to\/file<br \/>\nroo><br \/>\n  Alternatively, if you host your own repository you can deploy the file there:<br \/>\n      mvn deploy:deploy-file -DgroupId=com.sun -DartifactId=tools -Dversion=1.4.2 -Dpackaging=jar -Dfile=\/path\/to\/file -Durl=[url] -DrepositoryId=[id]<br \/>\nroo><br \/>\n  Path to dependency:<br \/>\n      1) org.codehaus.mojo:aspectj-maven-plugin:maven-plugin:1.2<br \/>\n      2) com.sun:tools:jar:1.4.2<br \/>\n----------<br \/>\n1 required artifact is missing.<br \/>\nfor artifact:<br \/>\n  org.codehaus.mojo:aspectj-maven-plugin:maven-plugin:1.2<br \/>\nfrom the specified remote repositories:<br \/>\n  spring-maven-milestone (http:\/\/maven.springframework.org\/milestone),<br \/>\n  central (http:\/\/repo1.maven.org\/maven2),<br \/>\n  spring-roo-repository (http:\/\/spring-roo-repository.springsource.org\/release),<br \/>\n  codehaus.org (http:\/\/snapshots.repository.codehaus.org),<br \/>\n  spring-maven-release (http:\/\/maven.springframework.org\/release)<br \/>\n<\/code><\/p>\n<p>I downloaded file from <a href=\"http:\/\/shrub.appspot.com\/maven.springframework.org\/milestone\/org\/aspectj\/aspectjtools\/1.6.12.M2\/\">here<\/a> and executed recommended file:<\/p>\n<p><code>mvn install:install-file -DgroupId=com.sun -DartifactId=tools -Dversion=1.4.2 -Dpackaging=jar -Dfile=\/space\/usr\/springsource\/spring-roo-1.1.5.RELEASE\/sts-cache-bEven\/aspectjtools-1.6.12.M2.jar<br \/>\nmvn install:install-file -DgroupId=com.sun -DartifactId=tools -Dversion=1.4.2 -Dpackaging=jar -Dfile=\/usr\/lib\/jvm\/jdk1.6.0_20\/lib\/tools.jar<br \/>\n<\/code><\/p>\n<p>didn&#8217;t help.<\/p>\n<p>I search a bit and found the post that talking about problems with <a href=\"http:\/\/www.mail-archive.com\/users@appfuse.dev.java.net\/msg17509.html\">version of jdk<\/a> (or mixing it up with jre).<\/p>\n<p><code><br \/>\n~\/src\/workspace\/bEven$ ls -l \/usr\/bin\/java<br \/>\nlrwxrwxrwx 1 root root 22 2010-08-02 09:49 \/usr\/bin\/java -> \/etc\/alternatives\/java<br \/>\n~\/src\/workspace\/bEven$ ls -l \/etc\/alternatives\/java<br \/>\nlrwxrwxrwx 1 root root 40 2010-08-02 09:49 \/etc\/alternatives\/java -> \/usr\/lib\/jvm\/java-6-openjdk\/jre\/bin\/java<br \/>\n~\/src\/workspace\/bEven$ cd \/etc\/alternatives\/<br \/>\n\/etc\/alternatives$ sudo ln -s \/usr\/lib\/jvm\/jdk1.6.0_20\/bin\/java java<br \/>\n\/etc\/alternatives$ sudo ln -s \/usr\/lib\/jvm\/jdk1.6.0_20\/bin\/javaws<br \/>\n<\/code><\/p>\n<p>and it really helped!<br \/>\n<code><br \/>\nroo> perform test<br \/>\n... downloaded some dependencies ...<br \/>\n-------------------------------------------------------<br \/>\n T E S T S<br \/>\n-------------------------------------------------------<br \/>\nResults :<br \/>\nTests run: 36, Failures: 0, Errors: 0, Skipped: 0<br \/>\n[INFO] ------------------------------------------------------------------------<br \/>\n[INFO] BUILD SUCCESSFUL<br \/>\n[INFO] ------------------------------------------------------------------------<br \/>\n[INFO] Total time: 3 minutes 52 seconds<br \/>\n[INFO] Finished at: Sun Jan 29 19:52:43 CET 2012<br \/>\n[INFO] Final Memory: 33M\/228M<br \/>\n[INFO] ------------------------------------------------------------------------<br \/>\nroo> perform eclipse<br \/>\n... downloaded some dependencies ...<br \/>\n[INFO] ------------------------------------------------------------------------<br \/>\n[INFO] BUILD SUCCESSFUL<br \/>\n[INFO] ------------------------------------------------------------------------<br \/>\n[INFO] Total time: 2 minutes 41 seconds<br \/>\n[INFO] Finished at: Sun Jan 29 19:57:22 CET 2012<br \/>\n[INFO] Final Memory: 25M\/188M<br \/>\n[INFO] ------------------------------------------------------------------------<br \/>\n<\/code><\/p>\n<p>I continued in command line (bash):<\/p>\n<p><code><br \/>\nmvn tomcat:run<br \/>\nmvn selenium:selenese<br \/>\n<\/code><\/p>\n<p>then I returned to roo and wrote<br \/>\n<code><br \/>\nperform eclipse<br \/>\n<\/code><\/p>\n<p>and now I can run springsource IDE.<\/p>\n<p>I used integrated google app engine deploy plugin, but unfortunately I am getting:<br \/>\n<code><br \/>\nError: Server Error<\/p>\n<p>The server encountered an error and could not complete your request.<br \/>\nIf the problem persists, please report your problem and mention this error message and the query that caused it.<br \/>\n<\/code><\/p>\n<p>I can see in logs following errors:<br \/>\n<code><br \/>\nCould not instantiate listener org.springframework.web.context.ContextLoaderListener<br \/>\njava.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener<br \/>\n\tat com.google.appengine.runtime.Request.process-931dad6b90a83fb7(Request.java)<br \/>\n\tat java.lang.ClassLoader.loadClass(ClassLoader.java:266)<br \/>\n\tat org.mortbay.jetty.handler.ContextHandler.loadClass(ContextHandler.java:1101)<br \/>\n\tat org.mortbay.jetty.webapp.WebXmlConfiguration.initListener(WebXmlConfiguration.java:630)<br \/>\n\tat org.mortbay.jetty.webapp.WebXmlConfiguration.initWebXmlElement(WebXmlConfiguration.java:368)<br \/>\n\tat org.mortbay.jetty.webapp.WebXmlConfiguration.initialize(WebXmlConfiguration.java:289)<br \/>\n\tat org.mortbay.jetty.webapp.WebXmlConfiguration.configure(WebXmlConfiguration.java:222)<br \/>\n\tat org.mortbay.jetty.webapp.WebXmlConfiguration.configureWebApp(WebXmlConfiguration.java:180)<br \/>\n\tat org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1247)<br \/>\n\tat org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)<br \/>\n\tat org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)<br \/>\n\tat org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)<br \/>\n\tat com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:449)<br \/>\n\tat com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:455)<br \/>\n\tat com.google.tracing.TraceContext.runInContext(TraceContext.java:695)<br \/>\n\tat com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:333)<br \/>\n\tat com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:325)<br \/>\n\tat com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:453)<br \/>\n\tat java.lang.Thread.run(Thread.java:679)<br \/>\njava.lang.ClassNotFoundException: org.springframework.web.filter.CharacterEncodingFilter<br \/>\n\tat com.google.appengine.runtime.Request.process-931dad6b90a83fb7(Request.java)<br \/>\n\tat java.lang.ClassLoader.loadClass(ClassLoader.java:266)<br \/>\n\tat org.mortbay.util.Loader.loadClass(Loader.java:91)<br \/>\n\tat org.mortbay.util.Loader.loadClass(Loader.java:71)<br \/>\n\tat org.mortbay.jetty.servlet.Holder.doStart(Holder.java:73)<br \/>\n\tat org.mortbay.jetty.servlet.FilterHolder.doStart(FilterHolder.java:81)<br \/>\n\tat org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)<br \/>\n\tat org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:662)<br \/>\n\tat org.mortbay.jetty.servlet.Context.startContext(Context.java:140)<br \/>\n\tat org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)<br \/>\n\tat org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)<br \/>\n\tat org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)<br \/>\n\tat org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)<br \/>\n\tat com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:449)<br \/>\n\tat com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:455)<br \/>\n\tat com.google.tracing.TraceContext.runInContext(TraceContext.java:695)<br \/>\n\tat com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:333)<br \/>\n\tat com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:325)<br \/>\n\tat com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:453)<br \/>\n\tat java.lang.Thread.run(Thread.java:679)<br \/>\nFailed startup of context com.google.apphosting.utils.jetty.RuntimeAppEngineWebAppContext@84f566{\/,\/base\/data\/home\/apps\/s~evenfriends\/1.356450658059803861}<br \/>\njavax.servlet.UnavailableException: org.springframework.web.filter.CharacterEncodingFilter<br \/>\n\tat org.mortbay.jetty.servlet.Holder.doStart(Holder.java:79)<br \/>\n\tat org.mortbay.jetty.servlet.FilterHolder.doStart(FilterHolder.java:81)<br \/>\n\tat org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)<br \/>\n\tat org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:662)<br \/>\n\tat org.mortbay.jetty.servlet.Context.startContext(Context.java:140)<br \/>\n\tat org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)<br \/>\n\tat org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)<br \/>\n\tat org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)<br \/>\n\tat org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)<br \/>\n\tat com.google.apphosting.runtime.jetty.AppVersionHandlerMap.createHandler(AppVersionHandlerMap.java:202)<br \/>\n\tat com.google.apphosting.runtime.jetty.AppVersionHandlerMap.getHandler(AppVersionHandlerMap.java:171)<br \/>\n\tat com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:123)<br \/>\n\tat com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:422)<br \/>\n\tat com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:449)<br \/>\n\tat com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:455)<br \/>\n\tat com.google.tracing.TraceContext.runInContext(TraceContext.java:695)<br \/>\n\tat com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:333)<br \/>\n\tat com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:325)<br \/>\n\tat com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:453)<br \/>\n\tat com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251)<br \/>\n\tat java.lang.Thread.run(Thread.java:679)<br \/>\nUncaught exception from servlet<br \/>\njavax.servlet.UnavailableException: Initialization failed.<br \/>\n\tat com.google.apphosting.runtime.jetty.AppVersionHandlerMap.createHandler(AppVersionHandlerMap.java:211)<br \/>\n\tat com.google.apphosting.runtime.jetty.AppVersionHandlerMap.getHandler(AppVersionHandlerMap.java:171)<br \/>\n\tat com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:123)<br \/>\n\tat com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:422)<br \/>\n\tat com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:449)<br \/>\n\tat com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:455)<br \/>\n\tat com.google.tracing.TraceContext.runInContext(TraceContext.java:695)<br \/>\n\tat com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:333)<br \/>\n\tat com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:325)<br \/>\n\tat com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:453)<br \/>\n\tat com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251)<br \/>\n\tat java.lang.Thread.run(Thread.java:679)<br \/>\n<\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Platform as a service really taking of lately (ups &#8211; last 3 years \ud83d\ude09 and I&#8217;ve decided that it is time for me to start messing around and try what is actually user experience and what frameworks to use. I started with simple idea &#8211; lets write an app. And because I travel a lot [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,6],"tags":[],"class_list":["post-237","post","type-post","status-publish","format-standard","hentry","category-cloud","category-google"],"_links":{"self":[{"href":"https:\/\/nax.cz\/index.php?rest_route=\/wp\/v2\/posts\/237","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nax.cz\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nax.cz\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nax.cz\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nax.cz\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=237"}],"version-history":[{"count":0,"href":"https:\/\/nax.cz\/index.php?rest_route=\/wp\/v2\/posts\/237\/revisions"}],"wp:attachment":[{"href":"https:\/\/nax.cz\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=237"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nax.cz\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=237"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nax.cz\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=237"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}