【问题标题】:Attaching shared-libs to WebSphere application's module将共享库附加到 WebSphere 应用程序的模块
【发布时间】:2015-06-29 12:01:21
【问题描述】:

根据 IBM 文档,我编写了一个 jython 脚本,将共享库添加到现有应用程序。

# Application name
app = sys.argv[0]

dep = AdminConfig.getid('/Deployment:' + app + '/')
depObject = AdminConfig.showAttribute(dep, 'deployedObject')
classldr = AdminConfig.showAttribute(depObject, 'classloader')

for x in range(1, len(sys.argv)):
    AdminConfig.create('LibraryRef', classldr, 
                       [['libraryName', sys.argv[x]], ['sharedClassloader', 'true']])

AdminConfig.save()

不幸的是,这只是为应用程序而不是为模块设置共享库。我怎样才能实现为两者设置库?

我试图获取应用程序的模块,但我无法获取它的类加载器。

顺便说一句,sharedClassloader 用于什么属性?

注意:我知道这是不好的做法,但我继承了一堆遗留应用程序,所以请不要建议摆脱共享库或添加 deployment.xml

【问题讨论】:

  • 对于从事此工作的人。一种选择是在安装期间: MapSharedLibForMod ;否则在这里使用检查 LibraryRef

标签: websphere shared-libraries jython wsadmin


【解决方案1】:

嗯,这是工作脚本addSharedLibrary.py <application-name> shared-lib [shared-lib...]

def addSharedLibrary(holder):
    classldr = AdminConfig.showAttribute(holder, 'classloader')
    for x in range(1, len(sys.argv)):
        AdminConfig.create('LibraryRef', classldr, [['libraryName', sys.argv[x]], ['sharedClassloader', 'true']])


def handleWebModules(applicationName):
    webModules = AdminConfig.list('WebModuleDeployment').split('\n')
    for webModule in webModules:
        if (webModule.find(applicationName) != -1):
            print 'Setting for ' + webModule
            addSharedLibrary(webModule)


dep = AdminConfig.getid('/Deployment:' + sys.argv[0] + '/')
addSharedLibrary(AdminConfig.showAttribute(dep, 'deployedObject'))
handleWebModules(app)

AdminConfig.save()

【讨论】:

    【解决方案2】:

    我认为实现此目的的一个好方法是在服务器级别创建一个共享库,然后在服务器级别也创建一个类加载器以加载库。

    set serv [$AdminConfig getid /Cell:mycell/Node:mynode/Server:server1/]
    
    print AdminConfig.create('Library', serv, [['name', 'mySharedLibrary'],     ['classPath',  
    'home/myProfile/mySharedLibraryClasspath']])
    
    AdminConfig.create('Library', serv,     [['name', 'mySharedLibrary'],              
    ['classPath','test1.jar;test2.jar;test3.jar']]) 
    
    appServer = AdminConfig.list('ApplicationServer', serv)
    print appServer
    
    classLoad = AdminConfig.showAttribute(appServer, 'classloaders')
    cleanClassLoaders = classLoad[1:len(classLoad)-1]
    classLoader1 = cleanClassLoaders.split(' ')[0]
    
    classLoader1 = AdminConfig.create('Classloader', appServer,     [['mode',  'PARENT_FIRST']])
    
    print AdminConfig.create('LibraryRef', classLoader1,     [['libraryName', 'MyshareLibrary']])
    
    AdminConfig.save()
    
    AdminNodeManagement.syncActiveNodes()
    

    【讨论】:

      【解决方案3】:

      感谢 poussma 提供的 jython 脚本,它适用于以前版本的 WAS... 所以我调整了您的代码,使其也可以在 WAS8 上运行:

      使用以下命令运行 cmd 行:addSharedLibrary.py <application-name> [shared-lib...]

      def addSharedLibrary(holder):
          classldr = AdminConfig.showAttribute(holder, 'classloader')
          for x in range(1, len(sys.argv)):
              AdminConfig.create('LibraryRef', classldr, [['libraryName', sys.argv[x]], ['sharedClassloader', 'true']])
      
      
      def handleWebModules(applicationName):
          webModules = AdminConfig.list('WebModuleDeployment').split('\r')
          webModules = map(lambda s: s.strip(), webModules)
          for webModule in webModules:
              if (webModule.find(applicationName+'.ear') != -1):
                  print 'Setting for ' + webModule
                  addSharedLibrary(webModule)
      
      
      dep = AdminConfig.getid('/Deployment:' + sys.argv[0] + '/')
      addSharedLibrary(AdminConfig.showAttribute(dep, 'deployedObject'))
      handleWebModules(sys.argv[0])
      
      AdminConfig.save()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-22
        • 1970-01-01
        • 2022-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多