2

複数の grails アプリケーションを Jboss にデプロイしたいと考えています。それらはすべて同じバージョンの grails (2.1.1) を使用しているため、共通の jar ファイルを war ファイルから除外し、Jboss モジュール経由で提供したいと考えています。まず、1 つのアプリケーションで試していますが、動作しません。

私が試したこと

  1. defaultDependenciesProvided trueBuildConfig.groovy に設定 (inherits("global"))
  2. モジュール フォルダーを作成しました: modules/commons/grails/main に、すべての共通 jar を配置します。
  3. module.xml を作成しました
  4. Dependencies: commons.grailswar内のMANIFEST.MFファイルに追加
  5. アプリをデプロイしようとした

何が起こった

10:16:12,800 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-3) JBAS015876: Starting deployment of "sofmk13-web-0.1.war"

10:16:23,095 WARN  [org.jboss.modules] (MSC service thread 1-4) Failed to define class org.codehaus.groovy.grails.web.taglib.jsp.JspInvokeGrailsTagLibTag in Module "commons.grails:main" from local module loader @4ec57293 (roots: C:\development\tools\jboss-as-7.1.2.Final\modules,C:\development\repository\jboss): java.lang.LinkageError: Failed to link org/codehaus/groovy/grails/web/taglib/jsp/JspInvokeGrailsTagLibTag (Module "commons.grails:main" from local module loader @4ec57293 (roots: C:\development\tools\jboss-as-7.1.2.Final\modules,C:\development\repository\jboss))
    at org.jboss.modules.ModuleClassLoader.defineClass(ModuleClassLoader.java:396)
    at org.jboss.modules.ModuleClassLoader.loadClassLocal(ModuleClassLoader.java:243)
    at org.jboss.modules.ModuleClassLoader$1.loadClassLocal(ModuleClassLoader.java:73)
    at org.jboss.modules.Module.loadModuleClass(Module.java:527)
    at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:182)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:468)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:456)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:398)
    at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:120)
    at java.lang.ClassLoader.defineClass1(Native Method) [rt.jar:1.7.0_17]
    at java.lang.ClassLoader.defineClass(ClassLoader.java:791) [rt.jar:1.7.0_17]
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) [rt.jar:1.7.0_17]
    at org.jboss.modules.ModuleClassLoader.doDefineOrLoadClass(ModuleClassLoader.java:327)
    at org.jboss.modules.ModuleClassLoader.defineClass(ModuleClassLoader.java:391)
    at org.jboss.modules.ModuleClassLoader.loadClassLocal(ModuleClassLoader.java:243)
    at org.jboss.modules.ModuleClassLoader$1.loadClassLocal(ModuleClassLoader.java:73)
    at org.jboss.modules.Module.loadModuleClass(Module.java:527)
    at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:182)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:468)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:456)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:398)
    at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:120)
    at java.lang.Class.forName0(Native Method) [rt.jar:1.7.0_17]
    at java.lang.Class.forName(Class.java:266) [rt.jar:1.7.0_17]
    at org.jboss.as.server.deployment.reflect.DeploymentClassIndex.classIndex(DeploymentClassIndex.java:54)
    at org.jboss.as.ee.component.deployers.EEModuleConfigurationProcessor.deploy(EEModuleConfigurationProcessor.java:81) [jboss-as-ee-7.1.2.Final.jar:7.1.2.Final]
    at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:116)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_17]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_17]
    at java.lang.Thread.run(Thread.java:722) [rt.jar:1.7.0_17]
Caused by: java.lang.NoClassDefFoundError: javax/servlet/jsp/tagext/DynamicAttributes
    at java.lang.ClassLoader.defineClass1(Native Method) [rt.jar:1.7.0_17]
    at java.lang.ClassLoader.defineClass(ClassLoader.java:791) [rt.jar:1.7.0_17]
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) [rt.jar:1.7.0_17]
    at org.jboss.modules.ModuleClassLoader.doDefineOrLoadClass(ModuleClassLoader.java:327)
    at org.jboss.modules.ModuleClassLoader.defineClass(ModuleClassLoader.java:391)
    ... 31 more
Caused by: java.lang.ClassNotFoundException: javax.servlet.jsp.tagext.DynamicAttributes from [Module "commons.grails:main" from local module loader @4ec57293 (roots: C:\development\tools\jboss-as-7.1.2.Final\modules,C:\development\repository\jboss)]
    at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:190)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:468)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:456)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:398)
    at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:120)
    ... 36 more

さまざまなクラスに対して同様の警告が多数あります。

誰かが次に何を試すべきか教えてもらえますか? エラーメッセージから正確に何が問題なのかを解読できません。

ありがとう!

4

2 に答える 2

2

いくつかの試行錯誤の後、最終的にいくつかの jar ファイルを除外し、それらをモジュールとして提供することができました。最も困難な部分は、すべての jar 依存関係を正しく取得することでした。以下に簡単な概要を示します。モジュールを使用するために war アーカイブを準備する方法の説明から始めます。次に、モジュールを jboss に追加する方法について説明します。

WAR アーカイブを準備します (モジュールが既に提供されていると仮定します)。

  1. /web-app/WEB-INF フォルダー内にjboss-deployment-structure.xmlファイルを作成します。ここでは、アプリケーションが使用するモジュールを指定し、適切なバージョンを設定します (slot パラメータを使用)。これらのモジュールは、次のステップで戦争から除外するすべての jar を提供することに注意してください。

    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
        <deployment>
            <dependencies>
                <module name="commons.restGrailsJars" slot="2.1.1"/>
                <module name="org.springframework" slot="3.1.2.RELEASE"/>
            </dependencies>
       </deployment>
    </jboss-deployment-structure>
    
  2. war ファイルから共有 jar を除外するコードを追加します。BuildConfig.groovy 内でgrails.war.resources構成オプションを使用します。war が作成される前に追加の処理を行うことができるため、共有 jar をアーカイブから削除できます (それらはリストに表示されます)。次の行をファイルに追加します。

    grails.war.resources = { resourceDir ->
    
    File libDir = new File(resourceDir, 'WEB-INF/lib')
    
    ['aopalliance',
    'asm',
    'aspectjrt',
    'aspectjweaver',
    'cglib',
    'commons-beanutils',
    'commons-codec',
    'commons-collections',
    'commons-dbcp',
    'commons-el',
    'commons-fileupload',
    'commons-io',
    'oro',
    'sitemesh',
    'slf4j',
    'spring-aop',
    'spring-asm',
    'spring-beans',
    'spring-core',
    'spring-expression',
    'xpp3_min',
    'h2',
    'servlet-api']
            .each { jarNameStart ->
                        libDir.eachFile { file ->
                            if (file.name.startsWith(jarNameStart)) {
                                file.delete()
                                 println "deleted jar $file"
                            }
                        }
             }
    
     } 
    

Jboss モジュールの追加

各 jar ライブラリに必要な依存関係がわかっていれば、モジュールの追加は非常に簡単です。Spring バージョン 3.2.3.RELEASE のモジュールを追加する例を次に示します。

  1. Spring フレームワークの jar は、modules/org/springframework フォルダー内に存在します。
  2. 3.2.3.RELEASE という名前の新しいフォルダーを作成し、共有できるすべての jar をコピーします*
  3. jar の横にmodule.xmlを配置します。次のようになります: (リリース バージョンとフォルダ名に対応するスロット値が変更されていることに注意してください)

    <module xmlns="urn:jboss:module:1.1" name="org.springframework" slot="3.2.3.RELEASE">
      <resources>
          <resource-root path="spring-asm-3.2.3.RELEASE.jar"/>
          <resource-root path="spring-core-3.2.3.RELEASE.jar"/>
          <resource-root path="spring-aop-3.2.3.RELEASE.jar"/>
          <resource-root path="spring-beans-3.2.3.RELEASE.jar"/>
          <resource-root path="spring-expression-3.2.3.RELEASE.jar"/>        
      </resources>
    
       <dependencies>
        <module name="aopalliance.aopalliance" export="true"/>
        <module name="cglib.cglib" export="true"/>
        <module name="org.aspectj.aspectjweaver" export="true"/>
        <module name="org.apache.commons.logging" export="true"/>
        <module name="org.apache.commons.pool" export="true"/>
        <module name="javax.servlet.api"/>
        <module name="javax.faces.api" slot="1.2" />
        <module name="com.sun.jsf-impl" slot="1.2" />
        <module name="org.jboss.vfs"/>
        <module name="javax.persistence.api"/>
        <module name="javax.xml.bind.api"/>
        <module name="javax.api"/>
        <module name="javax.jms.api"/>
        <module name="javax.annotation.api"/>
        </dependencies>
    </module>
    

一部のモジュールが欠落している場合、アプリケーションは展開されません (または展開されますが、電子メールの検証エラーなどの奇妙なことが起こります)。

war アーカイブから除外するすべてのライブラリに対して同様のことを行う必要があります。「WAR アーカイブの準備」セクション (2.) にリストされているすべての jar を除外することができました。

于 2013-06-06T19:16:37.400 に答える
1

すでにモジュールになっているルート リソースがいくつか含まれているため、JAR を含めるのではなく、依存関係を追加する必要があります。また、おそらく jcl-over-slf4j-1.6.2.jar の追加も避けるべきです。すでに slf4j ブリッジが提供されています。

このエラーは、javax.servlet.jsp.api への依存が必要であることを示しているようです。

詳しくは説明しませんでしたが、module.xml は次のようになるはずです。

<module xmlns="urn:jboss:module:1.1" name="commons.grails">
    <resources>
        <resource-root path="aopalliance-1.0.jar"/>
        <resource-root path="asm-3.1.jar"/>
        <resource-root path="aspectjrt-1.6.10.jar"/>
        <resource-root path="aspectjweaver-1.6.10.jar"/>
        <resource-root path="cglib-2.2.jar"/>
        <resource-root path="commons-codec-1.5.jar"/>
        <resource-root path="commons-dbcp-1.4.jar"/>
        <resource-root path="commons-el-1.0.jar"/>
        <resource-root path="commons-fileupload-1.2.2.jar"/>
        <resource-root path="commons-validator-1.3.1.jar"/>
        <resource-root path="concurrentlinkedhashmap-lru-1.2_jdk5.jar"/>
        <resource-root path="ehcache-core-2.4.6.jar"/>
        <resource-root path="grails-bootstrap-2.1.1.jar"/>
        <resource-root path="grails-core-2.1.1.jar"/>
        <resource-root path="grails-crud-2.1.1.jar"/>
        <resource-root path="grails-datastore-core-1.1.0.RELEASE.jar"/>
        <resource-root path="grails-datastore-gorm-1.1.0.RELEASE.jar"/>
        <resource-root path="grails-datastore-simple-1.1.0.RELEASE.jar"/>
        <resource-root path="grails-hibernate-2.1.1.jar"/>
        <resource-root path="grails-logging-2.1.1.jar"/>
        <resource-root path="grails-plugin-codecs-2.1.1.jar"/>
        <resource-root path="grails-plugin-controllers-2.1.1.jar"/>
        <resource-root path="grails-plugin-converters-2.1.1.jar"/>
        <resource-root path="grails-plugin-datasource-2.1.1.jar"/>
        <resource-root path="grails-plugin-domain-class-2.1.1.jar"/>
        <resource-root path="grails-plugin-filters-2.1.1.jar"/>
        <resource-root path="grails-plugin-gsp-2.1.1.jar"/>
        <resource-root path="grails-plugin-i18n-2.1.1.jar"/>
        <resource-root path="grails-plugin-log4j-2.1.1.jar"/>
        <resource-root path="grails-plugin-mimetypes-2.1.1.jar"/>
        <resource-root path="grails-plugin-scaffolding-2.1.1.jar"/>
        <resource-root path="grails-plugin-services-2.1.1.jar"/>
        <resource-root path="grails-plugin-servlets-2.1.1.jar"/>
        <resource-root path="grails-plugin-url-mappings-2.1.1.jar"/>
        <resource-root path="grails-plugin-validation-2.1.1.jar"/>
        <resource-root path="grails-resources-2.1.1.jar"/>
        <resource-root path="grails-spring-2.1.1.jar"/>
        <resource-root path="grails-web-2.1.1.jar"/>
        <resource-root path="groovy-all-1.8.8.jar"/>
        <resource-root path="icu4j-51_1.jar"/>
        <resource-root path="oro-2.0.8.jar"/>
        <resource-root path="postgresql-9.2-1002.jdbc4.jar"/>
        <resource-root path="sitemesh-2.4.jar"/>
        <resource-root path="spring-aop-3.1.2.RELEASE.jar"/>
        <resource-root path="spring-asm-3.1.2.RELEASE.jar"/>
        <resource-root path="spring-aspects-3.1.2.RELEASE.jar"/>
        <resource-root path="spring-beans-3.1.2.RELEASE.jar"/>
        <resource-root path="spring-context-3.1.2.RELEASE.jar"/>
        <resource-root path="spring-context-support-3.1.2.RELEASE.jar"/>
        <resource-root path="spring-core-3.1.2.RELEASE.jar"/>
        <resource-root path="spring-expression-3.1.2.RELEASE.jar"/>
        <resource-root path="spring-jdbc-3.1.2.RELEASE.jar"/>
        <resource-root path="spring-jms-3.1.2.RELEASE.jar"/>
        <resource-root path="spring-orm-3.1.2.RELEASE.jar"/>
        <resource-root path="spring-tx-3.1.2.RELEASE.jar"/>
        <resource-root path="spring-web-3.1.2.RELEASE.jar"/>
        <resource-root path="spring-webmvc-3.1.2.RELEASE.jar"/>
        <resource-root path="xpp3_min-1.1.4c.jar"/>
    </resources>


    <dependencies>
        <module name="javax.servlet.jsp.api" export="true"/>
        <module name="javax.servlet.jstl.api" export="true"/>
        <module name="com.h2database.h2"/>
        <module name="org.apache.commons.beanutils"/>
        <module name="org.apache.commons.collections"/>
        <module name="org.apache.commons.lang"/>
        <module name="org.apache.commons.io"/>
        <module name="org.apache.commons.pool"/>
        <module name="org.apache.log4j"/>
        <module name="org.slf4j"/>
    </dependencies>
</module>

不要な依存関係の一部を削除し、必要に応じてモジュールの依存関係を追加しました。

于 2013-05-06T16:16:07.957 に答える