2013-07-19 3 views
1

Я пытаюсь создать POM из пользовательских Artifact заводного класса, используя следующий код:StreamingMarkupBuilder.out это расценивается «» как префикс пространства имен

def outputBuilder = new StreamingMarkupBuilder() 

    List<Artifact> artifacts = [] 
    artifacts << new Artifact(groupId: "g", artifactId: "a", version: "v") 
    artifacts << new Artifact(groupId: "g1", artifactId: "a1", version: "v1") 

    def pom = { 
     project() { 
      modelVersion("4.0.0") 
      groupId("gi") 
      artifactId("ai") 
      version("007") 
      packaging("pom") 
      dependencyManagement() { 
       out << 
         artifacts.each { 
          dependency { 
           groupId(it.groupId) 
          } 
         } 
      } 
     } 
    } 

    println outputBuilder.bind(pom) 
} 

Запуска этого простого примера дает эту ошибку:

Exception in thread "main" groovy.lang.GroovyRuntimeException: Namespace prefix: groupId is not bound to a URI 
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) 
at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:77) 
at org.codehaus.groovy.reflection.CachedConstructor.doConstructorInvoke(CachedConstructor.java:71) 
at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrap.callConstructor(ConstructorSite.java:81) 
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallConstructor(CallSiteArray.java:57) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:182) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:190) 
at groovy.xml.StreamingMarkupBuilder$_closure6.doCall(StreamingMarkupBuilder.groovy:130) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90) 
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233) 
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272) 
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:909) 
at groovy.lang.Closure.call(Closure.java:411) 
at groovy.xml.streamingmarkupsupport.BaseMarkupBuilder$Document.invokeMethod(BaseMarkupBuilder.java:148) 
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeOnDelegationObjects(ClosureMetaClass.java:423) 
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:346) 
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:909) 
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:730) 
at groovy.lang.GroovyObjectSupport.invokeMethod(GroovyObjectSupport.java:44) 
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeOnDelegationObjects(ClosureMetaClass.java:407) 
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:346) 
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:909) 
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:730) 
at groovy.lang.GroovyObjectSupport.invokeMethod(GroovyObjectSupport.java:44) 
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeOnDelegationObjects(ClosureMetaClass.java:407) 
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:346) 
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:909) 
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:730) 
at groovy.lang.GroovyObjectSupport.invokeMethod(GroovyObjectSupport.java:44) 
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeOnDelegationObjects(ClosureMetaClass.java:407) 
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:346) 
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:909) 
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:730) 
at groovy.lang.GroovyObjectSupport.invokeMethod(GroovyObjectSupport.java:44) 
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeOnDelegationObjects(ClosureMetaClass.java:407) 
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:346) 
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:909) 
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:66) 
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:49) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:141) 

Как только я сменил groupId(it.groupId) на groupId("XXX"), печатается печально.

Как я могу «обмануть groovy», чтобы оценить переменную итератора groupId вместо того, чтобы оценивать ее как префикс без имени. groupId("$it.groupId") и прочее не работает.

Приветствия

ответ

2

it неявная переменная окружающей закрытия. В вашем случае it представляет собой неявную переменную для закрытия dependency{}, которая является неверной. Вы имели бы значение it как переменную, представляющую каждый артефакт от artifacts.

Решение, использовать, как показано ниже:

.... 
artifacts.each{ar -> 
    dependency{ 
     groupId(ar.groupId) 
    } 
} 
......