Java 是否可以重写glassfish\modules\webservices-osgi.jar中的类?

Java 是否可以重写glassfish\modules\webservices-osgi.jar中的类?,java,web-services,soap,glassfish,Java,Web Services,Soap,Glassfish,我已经编写了一个在glassfish服务器上运行的soap客户端应用程序 出于soap安全的原因,我必须更新Metro项目的一个类(SecurityHeather.java)部分,它是通过webservices-osgi.jar glassfish的模块提供的 在glassfish\modules\webservices-osgi.jar中是否有重写类的方法 最简单的方法是更新jar文件中的类并保存它。但我不确定这是不是最好的办法 这似乎是不可能的。我只是将类复制到jar文件中。然后重新启动服务

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

出于soap安全的原因,我必须更新Metro项目的一个类(SecurityHeather.java)部分,它是通过webservices-osgi.jar glassfish的模块提供的

在glassfish\modules\webservices-osgi.jar中是否有重写类的方法


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

这似乎是不可能的。我只是将类复制到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>

org.apache.maven.plugins
maven编译器插件
3.2
1.7
1.7
org.apache.maven.plugins
maven依赖插件
打开
生成源
打开
org.glassfish.metro
Web服务osgi
${original.webservices osgi.version}
罐子
真的
${project.build.directory}/classes
**/SecurityHeader*.class
org.apache.maven.plugins
maven源插件
附加来源
罐子

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

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

<?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>

/样本应用
保留生成的servlet类的java代码的副本。

注意,这并不适用于所有软件包。从glassfish文档中可以看出:对于许多包,包括java.*和javax.*,无论委托设置如何,符号解析始终委托给父类装入器。这可以防止应用程序重写核心Java运行时类或更改作为Java EE平台一部分的规范的API版本。