Java 是否可以重写glassfish\modules\webservices-osgi.jar中的类?
我已经编写了一个在glassfish服务器上运行的soap客户端应用程序 出于soap安全的原因,我必须更新Metro项目的一个类(SecurityHeather.java)部分,它是通过webservices-osgi.jar glassfish的模块提供的 在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文件中。然后重新启动服务
最简单的方法是更新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版本。