> Right, I mentioned the problem with the metaclass methods in the blog post. I
> won't have time today to look at this but I'll take a look this evening.
>
> Burt
>
> On Tuesday 02 September 2008 11:03:52 am Gregory W. Bond wrote:
>> i've been playing around with this code for a couple of days now trying to
>> get it to work in a self-contained jar file (since i eventually want to use
>> the code to access gorm from java) - the problem i run into is that the
>> dynamic gorm 'save()' method isn't found at runtime (see stack trace below)
>> - the problem disappears if i include the 'grails-app' directory containing
>> the domain class definitions in the same directory as the jar file
>> containing the compiled class files
>>
>> my jar file ('beckwith.jar') includes all the class files generated by
>> 'grails compile' as well as the 'grails-app' directory contents and the
>> 'application.properties' file - at the moment i have to include the file
>> 'scripts/Main.groovy' in the same directory as the jar file until i figure
>> out how to load it as a resource from the jar file
>>
>> here's the command i'm using to run the program
>>
>> java -classpath
>> beckwith.jar:$GRAILS_HOME/lib/groovy-all-1.5.6.jar:$GRAILS_HOME/lib/spring-
>>2.5.4.jar:$GRAILS_HOME/lib/commons-logging-1.1.jar:$GRAILS_HOME/dist/grails-
>>core-1.0.3.jar:$GRAILS_HOME/lib/javaee.jar:$GRAILS_HOME/dist/grails-spring-1
>>.0.3.jar:$GRAILS_HOME/dist/grails-gorm-1.0.3.jar:$GRAILS_HOME/lib/hibernate-
>>annotations.jar:$GRAILS_HOME/lib/hibernate3.jar:$GRAILS_HOME/lib/dom4j-1.6.1
>>.jar:$GRAILS_HOME/lib/hibernate-commons-annotations.jar:.:$GRAILS_HOME/lib/c
>>ommons-lang-2.1.jar:$GRAILS_HOME/lib/commons-collections-3.2.jar:lib/mysql-c
>>onnector-java-5.0.8-bin.jar:$GRAILS_HOME/lib/cglib-nodep-2.1_3.jar Tester
>>
>> here's the exception i get - any idea how to get around this?
>>
>> Exception in thread "main" groovy.lang.MissingMethodException: No signature
>> of method: com.burtbeckwith.gorm.domain.Book.save() is applicable for
>> argument types: () values: {}
>> at
>> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdap
>>ter.java:55) at
>> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdap
>>ter.java:60) at
>> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytec
>>odeAdapter.java:172) at
>> com.burtbeckwith.gorm.domain.Book.invokeMethod(Book.groovy) at
>> org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.ja
>>va:784) at
>> org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:7
>>58) at
>> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytec
>>odeAdapter.java:170) at
>> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethod0(ScriptBytec
>>odeAdapter.java:198) at Main.run(Main.groovy:7)
>> at groovy.lang.GroovyShell.evaluate(GroovyShell.java:473)
>> at groovy.lang.GroovyShell.evaluate(GroovyShell.java:508)
>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>> at
>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:3
>>9) at
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImp
>>l.java:25) at java.lang.reflect.Method.invoke(Method.java:585)
>> at
>> org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
>> at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:230)
>> at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912)
>> at
>> groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)
>> at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756)
>> at
>> org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.ja
>>va:778) at
>> org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:7
>>58) at
>> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytec
>>odeAdapter.java:170) at Tester$_main_closure1.doCall(Tester.groovy:12)
>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>> at
>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:3
>>9) at
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImp
>>l.java:25) at java.lang.reflect.Method.invoke(Method.java:585)
>> at
>> org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
>> at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:230)
>> at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912)
>> at
>> groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)
>> at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756)
>> at groovy.lang.Closure.call(Closure.java:292)
>> at groovy.lang.Closure.call(Closure.java:305)
>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>> at
>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:3
>>9) at
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImp
>>l.java:25) at java.lang.reflect.Method.invoke(Method.java:585)
>> at
>> org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
>> at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:230)
>> at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912)
>> at
>> groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)
>> at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756)
>> at
>> org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.ja
>>va:778) at
>> org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:7
>>58) at
>> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytec
>>odeAdapter.java:170) at
>> com.burtbeckwith.gorm.GormHelper$_withTransaction_closure1.doCall(GormHelpe
>>r.groovy:133) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>> at
>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:3
>>9) at
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImp
>>l.java:25) at java.lang.reflect.Method.invoke(Method.java:585)
>> at
>> org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
>> at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:230)
>> at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912)
>> at
>> groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)
>> at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756)
>> at groovy.lang.Closure.call(Closure.java:292)
>> at
>> org.codehaus.groovy.runtime.ConvertedClosure.invokeCustom(ConvertedClosure.
>>java:48) at
>> org.codehaus.groovy.runtime.ConversionHandler.invoke(ConversionHandler.java
>>:72) at $Proxy0.doInTransaction(Unknown Source)
>> at
>> org.springframework.transaction.support.TransactionTemplate.execute(Transac
>>tionTemplate.java:128) at
>> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:3
>>9) at
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImp
>>l.java:25) at java.lang.reflect.Method.invoke(Method.java:585)
>> at
>> org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
>> at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:230)
>> at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912)
>> at
>> groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)
>> at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756)
>> at
>> org.codehaus.groovy.runtime.InvokerHelper.invokePojoMethod(InvokerHelper.ja
>>va:766) at
>> org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:7
>>54) at
>> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytec
>>odeAdapter.java:170) at
>> com.burtbeckwith.gorm.GormHelper.withTransaction(GormHelper.groovy:132)
>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>> at
>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:3
>>9) at
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImp
>>l.java:25) at java.lang.reflect.Method.invoke(Method.java:585)
>> at
>> org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
>> at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:230)
>> at
>> groovy.lang.MetaClassImpl.invokeStaticMethod(MetaClassImpl.java:1105)
>> at
>> org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:7
>>49) at
>> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytec
>>odeAdapter.java:170) at Tester.main(Tester.groovy:10)
>>
>> burtbeckwith wrote:
>> > I spent some time on this and got it working. I've posted a writeup and a
>> > zip
>> > file here:
http://burtbeckwith.com/blog/?p=66>> >
>> > Burt
>> >
>> > On Saturday 23 August 2008 3:59:22 pm Christopher Mason wrote:
>> >> Clarifying:
>> >>
>> >> So there are two projects that purport to allow one to use grails
>> >> without having a web server around:
>> >>
>> >>
http://docs.codehaus.org/display/GRAILS/GORM+-+StandAlone+Gorm>> >> which is based on:
>> >>
http://jweldin.com/blog/?p=6>> >>
>> >> However, both are over a year old and don't compile. Both use this
>> >> constructor:
>> >>
>> >> application =
>> >> new DefaultGrailsApplication( groovyFiles, new
>> >> GormInjectionOperation() )
>> >>
>> >> which, it seems, no longer exists.
>> >>
>> >> My suspicion is that this configuration is all done now via Spring. Is
>> >> this true?
>> >>
>> >> I'm trying to read through the grails Gant scripts source to figure out
>> >> how grails starts up, but it's not clear yet. I've tried various
>> >> methods on GrailsUtil like:
>> >>
>> >> GrailsUtil.bootstrapGrailsFromApplication(grailsApplication)
>> >> or
>> >> ApplicationContext appContext = GrailsUtil
>> >> .bootstrapGrailsFromClassPath()
>> >> DefaultGrailsApplication grailsApplication =
>> >> (DefaultGrailsApplication)appContext
>> >> .getBean("grailsApplication", D
>> >> efaultGrailsApplication.class);
>> >>
>> >> but this seems to result in class not found errors, I assume because the
>> >> Gant scripts are responsible for classpathy stuff that I'm not yet doing
>> >> (eg Init.groovy:setClasspath()). Am I headed in the right direction?
>> >>
>> >> If I simply omit the GormInjectionOperation from the code posted above,
>> >> obviously, none of the GORM methods are available on doman objects.
>> >>
>> >> Any hints would be most appreciated. My goal is something I can run via
>> >> java -jar that will execute a groovy script using GORM domain classes.
>> >>
>> >> I offer beer to anyone who can help me get this working! And I promise
>> >> to post it somewhere for all to read!
>> >>
>> >> -c
>> >>
>> >> Christopher Mason wrote:
>> >> > Can anyone help update this code for grails 1.0.3?
>> >> >
>> >> >
http://jweldin.com/blog/?p=6>> >> >
>> >> > Does anyone have this working? (I see several posts but none of them
>> >> > seem to have successful resolutions.)
>> >> >
>> >> > Thanks so much!
>> >> >
>> >> > -c
>> >> >
>> >> >
>> >> > import groovy.lang.GroovyClassLoader;
>> >> > import groovy.lang.GroovyObject;
>> >> > import org.codehaus.groovy.grails.commons.*;
>> >> > import org.codehaus.groovy.grails.orm.hibernate.cfg.*;
>> >> > import org.hibernate.SessionFactory;
>> >> > import org.springframework.core.io.*;
>> >> > import org.springframework.core.io.support.*
>> >> > import
>> >> > org.codehaus.groovy.grails.compiler.injection.GrailsAwareClassLoader
>> >> > import org.codehaus.groovy.grails.compiler.injection.ClassInjector;
>> >> >
>> >> > class RunScript
>> >> > {
>> >> > public static void main(String[] args)
>> >> > {
>> >> >
>> >> > if (args.length < 2) {
>> >> > println "Usage: java -jar profiler-script.jar <db.props>
>> >> > <script name> <script args>"
>> >> > }
>> >> >
>> >> > GrailsApplication grailsApplication = null;
>> >> > SessionFactory sessionFactory = null;
>> >> >
>> >> > PathMatchingResourcePatternResolver resolver = new
>> >> > PathMatchingResourcePatternResolver();
>> >> >
>> >> > Resource[] groovyFiles =
>> >> > resolver.getResources("classpath*:**grails-app/**/*.groovy");
>> >> >
>> >> > grailsApplication = new DefaultGrailsApplication(groovyFiles);
>> >> >
>> >> > GrailsAwareClassLoader gcl = new GrailsAwareClassLoader()
>> >> > gcl.setClassInjectors([ new DefaultGrailsDomainClassInjector()
>> >>
>> >> ]
>> >>
>> >> > as ClassInjector[])
>> >> >
>> >> > DefaultGrailsDomainConfiguration config = new
>> >> > DefaultGrailsDomainConfiguration();
>> >> > config.setGrailsApplication(grailsApplication);
>> >> >
>> >> > Properties props = new Properties();
>> >> > props.load(new FileInputStream(args[0]));
>> >> > config.setProperties(props);
>> >> >
>> >> > sessionFactory = config.buildSessionFactory();
>> >> >
>> >> > GrailsHibernateUtil.configureDynamicMethods(sessionFactory,
>> >> > grailsApplication);
>> >> >
>> >> > GroovyClassLoader cl = gcl
>> >> > //grailsApplication.getClassLoader()
>> >> >
>> >> > println "\n-----------\nBefore Main\n-----------\n"
>> >> >
>> >> > Binding b = new Binding(args[3..args.length-1] as String[])
>> >> > def TestDomainScript =
>> >> > (Script)cl.loadClass(args[1],false,true).newInstance(b)
>> >> > TestDomainScript.run()
>> >> >
>> >> > println "\n-----------\nAfter Main\n-----------\n"
>> >> > println "\nDone";
>> >> >
>> >> > }
>> >> > }
>> >> >
>> >> >
>> >> > import
>> >> > org.codehaus.groovy.grails.compiler.injection.GrailsInjectionOperation
>> >> >; import org.codehaus.groovy.grails.compiler.injection.*;
>> >> > import org.apache.commons.logging.Log;
>> >> > import org.apache.commons.logging.LogFactory;
>> >> > import org.codehaus.groovy.ast.ClassNode;
>> >> > import org.codehaus.groovy.classgen.GeneratorContext;
>> >> > import org.codehaus.groovy.control.CompilationFailedException;
>> >> > import org.codehaus.groovy.control.CompilationUnit;
>> >> > import org.codehaus.groovy.control.Phases;
>> >> > import org.codehaus.groovy.control.SourceUnit;
>> >> > import
>> >>
>> >> org.codehaus.groovy.grails.compiler.support.GrailsResourceLoader;
>> >>
>> >> > import org.codehaus.groovy.grails.commons.GrailsResourceUtils
>> >> > import org.codehaus.groovy.grails.compiler.GrailsClassLoader;
>> >> >
>> >> > public class MyInjectionOperation extends GrailsInjectionOperation
>> >> > {
>> >> >
>> >> > private static GrailsDomainClassInjector injector = new
>> >> > DefaultGrailsDomainClassInjector();;
>> >> > private GrailsResourceLoader resourceLoader;
>> >> >
>> >> > public void call(SourceUnit source, GeneratorContext context,
>> >> > ClassNode classNode) throws CompilationFailedException
>> >> > {
>> >> >
>> >> > if(resourceLoader != null)
>> >> > {
>> >> > try {
>> >> > URL url;
>> >> > if(GrailsResourceUtils.isGrailsPath(source.getName()))
>> >> > {
>> >> > url =
>> >>
>> >> resourceLoader.loadGroovySource(GrailsResourceUtils.getClassName(source.
>> >>g
>> >>
>> >> >etName()));
>> >> >
>> >> > }
>> >> > else
>> >> > {
>> >> > url =
>> >> > resourceLoader.loadGroovySource(source.getName());
>> >> > }
>> >> > if(GrailsResourceUtils.isDomainClass(url))
>> >> > {
>> >> >
>> >> > this.injector.performInjection(source,context,classNode);
>> >> > }
>> >> >
>> >> > }
>> >> > catch (MalformedURLException e)
>> >> > {
>> >> > println("Error loading URL during addition of compile
>> >> > time properties: " + e.getMessage(),e);
>> >> > throw new
>> >> > CompilationFailedException(Phases.CONVERSION,source,e);
>> >> > }
>> >> > }
>> >> > }
>> >> >
>> >> > public void setResourceLoader(GrailsResourceLoader resourceLoader)
>> >> > {
>> >> > this.resourceLoader = resourceLoader;
>> >> > }
>> >> > }
>> >> >
>> >> >
>> >> >
>> >> >
>> >> > ---------------------------------------------------------------------
>> >> > To unsubscribe from this list, please visit:
>> >> >
>> >> >
http://xircles.codehaus.org/manage_email>> >>
>> >> ---------------------------------------------------------------------
>> >> To unsubscribe from this list, please visit:
>> >>
>> >>
http://xircles.codehaus.org/manage_email>> >
>> > ---------------------------------------------------------------------
>> > To unsubscribe from this list, please visit:
>> >
>> >
http://xircles.codehaus.org/manage_email>
>
>
> ---------------------------------------------------------------------
> To unsubscribe from this list, please visit:
>
>
http://xircles.codehaus.org/manage_email>
>
>