在groovy项目中使用grails插件类?

时间:2014-05-22 11:23:47

标签: grails groovy

是否可以将grails二进制插件中的类用作groovy项目中的常规依赖项?

经过许多不同的方法之后,答案似乎是否定的,但我觉得只有一个缺失的小部分处理依赖关系。

使用:

  • 样本 - grails(grails 2.3.7):带有一个假人的二元grails插件 域名
  • sample-groovy(groovy 2.2.1):非常的Groovy项目 打印'Hi'和常规依赖 '采样的grails-1.0-SNAPSHOT.jar'

问题:

  1. 如果您不添加任何内容,则无法编译:

    NoClassDefFoundError:org / grails / datastore / mapping / dirty / checking / DirtyCheckable。

  2. 添加依赖项“org.grails:grails-datastore-gorm-hibernate4:3.0.0.RELEASE”

    NoClassDefFoundError:Lorg / codehaus / groovy / grails / plugins / web / api / ControllersDomainBindingApi;

  3. 添加依赖项“org.grails:grails-plugin-controllers:2.3.7”

    编译确定

    在运行时崩溃:

    线程“main”中的异常java.lang.NoClassDefFoundError:javax / servlet / ServletResponse     at org.codehaus.groovy.grails.plugins.web.api.ControllersDomainBindingApi.getDomainClass(ControllersDomainBindingApi.java:97)     在org.codehaus.groovy.grails.plugins.web.api.ControllersDomainBindingApi.initialize(ControllersDomainBindingApi.java:58)     在com.nortia.sample.Other。(Other.groovy)     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)     at java.lang.reflect.Constructor.newInstance(Constructor.java:513)     在org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:77)     at org.codehaus.groovy.runtime.callsite.ConstructorSite $ ConstructorSiteNoUnwrapNoCoerce.callConstructor(ConstructorSite.java:102)     在org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallConstructor(CallSiteArray.java:57)     在org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:182)     在org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:190)     在Library.main(Library.groovy:7) 引起:java.lang.ClassNotFoundException:javax.servlet.ServletResponse     在java.net.URLClassLoader $ 1.run(URLClassLoader.java:202)     at java.security.AccessController.doPrivileged(Native Method)     在java.net.URLClassLoader.findClass(URLClassLoader.java:190)     at java.lang.ClassLoader.loadClass(ClassLoader.java:306)     在sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:301)     at java.lang.ClassLoader.loadClass(ClassLoader.java:247)     ......还有13个

1 个答案:

答案 0 :(得分:2)

创建二进制插件并不是最好的方法,因为二进制插件确实需要Grails环境。但是,您可以使用Gradle创建二进制插件。 Cloud Foundry团队这样做,您需要做的就是创建您的插件类。例如:

https://github.com/cloudfoundry/java-buildpack-auto-reconfiguration/blob/master/auto-reconfiguration/src/main/groovy/org/cloudfoundry/reconfiguration/grails/JavaBuildpackAutoReconfigurationGrailsPlugin.groovy

然后创建一个指向该类的META-INF/grails-plugin.xml文件。例如:

https://github.com/cloudfoundry/java-buildpack-auto-reconfiguration/blob/master/auto-reconfiguration/src/main/resources/META-INF/grails-plugin.xml

然后,您可以使用Gradle的标准groovy插件来构建您的项目。

如果要创建GORM实体,则需要在GORM jar上添加依赖项。例如:

 compile "org.grails:grails-datastore-gorm-hibernate4:3.1.0.RELEASE"

然后用grails.persistence.Entity注释每个GORM实体。例如:

 import grails.persistence.*

 @Entity
 class Foo { 
    String bar 
 }

然后修改您的grails-plugin.xml文件以指向实体。例如:

    <plugin name='myplugin' version='0.1' grailsVersion='2.4 &gt; *'>
      <author>Your name</author>
      <title>My Plugin</title>
      <type>foo.bar.MyGrailsPlugin</type>
      <resources>
        <resource>mybin.Foo</resource>
      </resources>
    </plugin>