Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
指明;“提供”;maven下grails的依赖关系_Grails_Maven_Build Dependencies - Fatal编程技术网

指明;“提供”;maven下grails的依赖关系

指明;“提供”;maven下grails的依赖关系,grails,maven,build-dependencies,Grails,Maven,Build Dependencies,我有一个Grails1.3.7应用程序。我正在使用Spring的JMS类将我的一个grails服务设置为消息侦听器,在grails app/conf/resources.groovy中设置这些类。我使用maven 2.0.9进行构建,使用grails maven插件1.3.7和“maven war”目标创建war文件 我有两种情况: 我希望能够使用“mvn grails:run app”从命令行在本地运行我的grails应用程序。我在开发过程中使用它 我希望通过部署maven创建的war文件,能

我有一个Grails1.3.7应用程序。我正在使用Spring的JMS类将我的一个grails服务设置为消息侦听器,在grails app/conf/resources.groovy中设置这些类。我使用maven 2.0.9进行构建,使用grails maven插件1.3.7和“maven war”目标创建war文件

我有两种情况:

  • 我希望能够使用“mvn grails:run app”从命令行在本地运行我的grails应用程序。我在开发过程中使用它
  • 我希望通过部署maven创建的war文件,能够在JBoss 5.1.0 GA中运行应用程序。这就是我们在集成、测试和生产环境中所做的
  • 在JBoss内部运行时,所有与JMS提供程序相关的依赖项都可用,并由应用程序服务器提供。maven处理此问题的正常方法是在pom文件中声明这些依赖项,范围为“提供”。这将使这些依赖项可用于编译和单元测试,但将它们从war文件中排除

    然而,当我使用“mvn grails:run app”从命令行在本地运行时,grails似乎无法在运行时使用这些依赖项,许多ClassNotFound等异常就证明了这一点。将作用域更改为“compile”允许我在本地运行。然而,现在这些依赖项被打包到我的war文件中,我不想要这个文件,并且在JBoss中运行时会破坏它

    我目前找到的解决方案(或解决方法)是在pom中包含这些具有默认(编译)范围的JMS依赖项,并通过BuildConfig.groovy中的一些代码从war文件中删除这些JAR(及其所有可传递的依赖项)(见下文)。这是可行的,但它混乱且容易出错,因为我必须列出每个可传递依赖项(其中有很多!)

    我还尝试了其他一些事情:

    起初,我想也许我可以在“grails.project.dependency.resolution/dependencies”部分中向BuildConfig.groovy添加所需的JMS依赖项,并将它们完全排除在pom之外。但是,这不起作用,因为根据,在maven下运行grails时,BuildConfig依赖项部分被忽略

    我还注意到了“pom true”选项(在上面的链接中提到),并尝试使用它。但是,当尝试运行grails:run-app时,grails会抛出有关未解析依赖项的警告,并给出一个tomcat错误:

    :::: WARNINGS
    ::::::::::::::::::::::::::::::::::::::::::::::
    ::          UNRESOLVED DEPENDENCIES         ::
    ::::::::::::::::::::::::::::::::::::::::::::::
    :: commons-collections#commons-collections;3.2.1: configuration not found in commons-collections#commons-collections;3.2.1: 'master'. It was required from org.grails.internal#load-manager-grails;1.2-SNAPSHOT compile
    :: org.slf4j#slf4j-api;1.5.8: configuration not found in org.slf4j#slf4j-api;1.5.8: 'master'. It was required from org.grails.internal#load-manager-grails;1.2-SNAPSHOT runtime
    
    ...
    
    java.lang.LinkageError: loader constraint violation: when resolving overridden method "org.apache.tomcat.util.digester.Digester.setDocumentLocator(Lorg/xml/sax/Locator;)V" the class loader (instance of org/codehaus/groovy/grails/cli/support/GrailsRootLoader) of the current class, org/apache/tomcat/util/digester/Digester, and its superclass loader (instance of <bootloader>), have different Class objects for the type org/xml/sax/Locator used in the signature
            at org.grails.tomcat.TomcatServer.start(TomcatServer.groovy:212)
    
    pom.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    
        . . .
    
        <dependencies>
    
            . . .
    
            <dependency>
                <!-- already a dep of grails-crud; make it scope:compile for resources.groovy -->
                <groupId>org.springframework</groupId>
                <artifactId>spring-jms</artifactId>
                <version>3.0.5.RELEASE</version>
            </dependency>
            <!-- Note: all the remaining jms dependencies below should be 'provided' scope, but
                 grails doesn't correctly pull them in when running locally, so we must leave
                 them as compile scope and remove them (and their transitive dependencies) from
                 the war file through BuildConfig.groovy
            -->
            <dependency>
                <groupId>org.jboss.javaee</groupId>
                <artifactId>jboss-jms-api</artifactId>
                <version>1.1.0.GA</version>
            </dependency>
            <dependency>
                <groupId>org.jboss.naming</groupId>
                <artifactId>jnp-client</artifactId>
                <version>5.0.3.GA</version>
            </dependency>
            <dependency>
                <groupId>jboss.messaging</groupId>
                <artifactId>jboss-messaging</artifactId>
                <version>1.4.3.GA</version>
            </dependency>
            <dependency>
                <groupId>org.jboss.aop</groupId>
                <artifactId>jboss-aop</artifactId>
                <version>2.1.1.GA</version>
                <classifier>client</classifier>
                <exclusions>
                    <exclusion>
                        <!-- see http://jira.codehaus.org/browse/GROOVY-3356 -->
                        <groupId>apache-xerces</groupId>
                        <artifactId>xml-apis</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>org.jboss.remoting</groupId>
                <artifactId>jboss-remoting</artifactId>
                <version>2.5.3.SP1</version>
            </dependency>
            <dependency>
                <groupId>jboss</groupId>
                <artifactId>jboss-serialization</artifactId>
                <version>1.0.3.GA</version>
            </dependency>
            <dependency>
                <groupId>oswego-concurrent</groupId>
                <artifactId>concurrent</artifactId>
                <version>1.3.4-jboss-update1</version>
            </dependency>
            <!-- the following two are required in order to connect to HA-JNDI -->
            <dependency>
                <groupId>org.jboss.jbossas</groupId>
                <artifactId>jboss-as-cluster</artifactId>
                <classifier>jboss-ha-legacy-client</classifier>
                <version>5.1.0.GA</version>
            </dependency>
            <dependency> 
                <groupId>org.jboss.cluster</groupId>
                <artifactId>jboss-ha-client</artifactId>
                <version>1.1.1.GA</version>
            </dependency>
    
            <!-- End dependencies for connecting to JMS -->
    
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.grails</groupId>
                    <artifactId>grails-maven-plugin</artifactId>
                    <version>1.3.7</version>
                    <extensions>true</extensions>
                    <executions>
                        <execution>
                            <goals>
                                <goal>init</goal>
                                <goal>maven-clean</goal>
                                <goal>validate</goal>
                                <goal>config-directories</goal>
                                <goal>maven-compile</goal>
                                <goal>maven-test</goal>
                                <goal>maven-war</goal>
                                <goal>maven-functional-test</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </project>
    

    解决方案是通过概要文件为依赖项创建一个动态范围

    例如:

    <?xml version="1.0" encoding="utf-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    
    . . .
    <properties>
       <jms.deps.scope>compile</jms.deps.scope>
    </properties>
    
    <profile>
       <id>build</id>
       <properties>
           <jms.deps.scope>provided</jms.deps.scope>
       </properties>
    </profile>
    
    <dependencies>
       <dependency>
          <groupId>whatever</groupId>
          <artifactId>whatever</artifactId>
          <scope>${jms.deps.scope}</scope>
       </dependency>
    </dependencies>
    
    . . .
    

    希望这有帮助。

    这在Grails2.0中已经“修复”。grails的maven插件已经更新,因此“提供的”范围意味着依赖项在本地运行时可用,但不包括在包war文件中。

    这主要起作用。仍然必须通过BuildConfig.groovy从war文件中删除一些依赖项,因为grails在运行编译步骤(在本例中为jboss jms api)时似乎忽略了“提供的”依赖项。我还必须删除grails插件(即hibernate及其依赖项)拉入的jar。最后,grails的集成测试无法正确运行,因为grails没有引入必要的“提供的”依赖项。但是最终的结果是减少了101行代码,这个问题在Grails2.0中已经解决了。见下文。
    import org.codehaus.groovy.grails.commons.ConfigurationHolder
    import org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter
    import org.springframework.jms.listener.DefaultMessageListenerContainer
    import org.springframework.jms.listener.adapter.MessageListenerAdapter
    import org.springframework.jms.support.destination.JndiDestinationResolver
    import org.springframework.jndi.JndiObjectFactoryBean
    import org.springframework.jndi.JndiTemplate
    
    beans = {
    
        def config = ConfigurationHolder.config
    
        jndiTemplate(JndiTemplate) {
            environment = config.myQueue.ctx.toProperties() // flattens a{b{c}} to 'a.b.c'
        }
    
        jmsFactory(JndiObjectFactoryBean) {
            jndiTemplate = jndiTemplate
            jndiName = config.myQueue.connectionFactory as String
            lookupOnStartup = false // need this?
            proxyInterface = "javax.jms.ConnectionFactory"
        }
    
        authJmsFactory(UserCredentialsConnectionFactoryAdapter) {
            targetConnectionFactory = jmsFactory
            username = config.app.auth.username as String
            password = config.app.auth.password as String
        }
    
        destinationResolver(JndiDestinationResolver) {
            jndiTemplate = jndiTemplate
        }
    
        jmsMessageListener(MessageListenerAdapter, ref("myMessageDrivenService")) {
            defaultListenerMethod = "onEventMessage"
        }
    
        jmsContainer(DefaultMessageListenerContainer) {
            connectionFactory = authJmsFactory
            destinationResolver = destinationResolver
            destinationName = config.eventQueue.queueName as String
            messageListener = jmsMessageListener
            transactionManager = ref("transactionManager") // grails' txn mgr
            cacheLevel = DefaultMessageListenerContainer.CACHE_CONNECTION
            autoStartup = false // started up in Bootstrap.groovy
        }
    }
    
    <?xml version="1.0" encoding="utf-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    
    . . .
    <properties>
       <jms.deps.scope>compile</jms.deps.scope>
    </properties>
    
    <profile>
       <id>build</id>
       <properties>
           <jms.deps.scope>provided</jms.deps.scope>
       </properties>
    </profile>
    
    <dependencies>
       <dependency>
          <groupId>whatever</groupId>
          <artifactId>whatever</artifactId>
          <scope>${jms.deps.scope}</scope>
       </dependency>
    </dependencies>
    
    . . .
    
    mvn clean install war -P build