是否可以覆盖glassfish \ modules \ webservices-osgi.jar中的类?

时间:2014-12-17 00:12:03

标签: java web-services soap glassfish

我编写了一个在glassfish服务器上运行的soap客户端应用程序。

出于肥皂安全原因,我不得不更新Metro项目的一个类(SecurityHeather.java),它是通过webservices-osgi.jar glassfish的模块提供的。

无论如何都要覆盖glassfish \ modules \ webservices-osgi.jar中的类?

最简单的方法是更新jar文件中的类并保存它。但我不确定它是最好的方式。

3 个答案:

答案 0 :(得分:4)

在搜索了很多类似的帖子并阅读了大量的glassfish文档之后,我能够找到解决这个问题的方法。有一个glassfish-web.xml部署描述符,它定义了元素类加载器。默认情况下,类加载器将所有类加载功能委托给其父类加载器,后者在glassfish安装目录的modules文件夹中查找jar。如果我们将class-loader元素的delegate属性设置为false,则委托模型被反转,子类加载器执行类加载,首先加载war库中可用的类,然后查看glassfish模块文件夹。

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish 
 Application Server 3.1 Servlet 3.0//EN" 
"http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app error-url="">
  <context-root>/SampleApp</context-root>
  <class-loader delegate="false"/>
 <jsp-config>
   <property name="keepgenerated" value="true">
     <description>Keep a copy of the generated servlet class' java code.
     </description>
     </property>
   </jsp-config>
  </glassfish-web-app>

答案 1 :(得分:0)

似乎不可能。我只是复制jar文件中的类。并重新启动服务器

但是我让它自动用maven覆盖了这个类。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.2</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>unpack</id>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>unpack</goal>
                    </goals>
                    <configuration>
                        <artifactItems>
                            <artifactItem>
                                <groupId>org.glassfish.metro</groupId>
                                <artifactId>webservices-osgi</artifactId>
                                <version>${original.webservices-osgi.version}</version>
                                <type>jar</type>
                                <overWrite>true</overWrite>
                                <outputDirectory>${project.build.directory}/classes</outputDirectory>
                                <excludes>
                                    **/SecurityHeader*.class
                                </excludes>
                            </artifactItem>
                        </artifactItems>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <executions>
                <execution>
                    <id>attach-sources</id>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

答案 2 :(得分:0)

是的,这是可能的。研究JRebel或DCEVM + Hotswap