相关疑难解决方法(0)

使用类加载器隔离静态单例类

免责声明:鉴于这个问题,这可能不是最佳解决方案,但我很好奇如何实现这一实施.

问题我正在尝试处理一些遗留代码,这些代码的单例定义如下:

public class LegacySingleton {
    private static Boolean value;

    public static void setup(boolean v) {
        if (value != null) {
            throw new RuntimeException("Already Set up");
        }
        value = v;
        System.out.println("Setup complete");
    }

    public static void teardown() {
        value = null;
        System.out.println("Teardown complete");
    }

    public static boolean getValue() {
        return value;
    }
}
Run Code Online (Sandbox Code Playgroud)

我无法更改此设计,并且在整个代码库中大量使用该类.此单例返回的值可以极大地改变代码的功能.例如:

public class LegacyRequestHandler {
    public void handleRequest() {
        if (LegacySingleton.getValue()) {
            System.out.println("Path A");
        } else {
            System.out.println("Path B");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我想要代码Path A,那么我必须以 …

java legacy static classloader

8
推荐指数
1
解决办法
441
查看次数

如何创建不会在父级中搜索加载类的ClassLoader

我想我理解类加载层次结构是如何工作的.(JVM首先查看父层次结构)

所以我想创建一个ClassLoader,或者使用一个完全独立的范围的现有库,而不是查看父ClassLoading层次结构.实际上我正在寻找启动单独JVM的相同效果,但实际上没有这样做.

我有信心这是可能的,但是很难找到一个如何做到这一点的简单例子.

java classloader

7
推荐指数
1
解决办法
2054
查看次数

JAXB在Java 7下发布,它说它无法找到RI 2.1.0

我正在使用Oracle Java 7 Update 3在Ubuntu上运行测试.根据发行说明,它附带了JAXB-2.2.4.

/home/ubuntu# update-alternatives --config java
There is only one alternative in link group java: /usr/lib/jvm/java-7-oracle/bin/java
Nothing to configure.
Run Code Online (Sandbox Code Playgroud)

机器上说它上面有JAXB-2.2.4:

$ wsimport -version
JAX-WS RI 2.2.4-b01
Run Code Online (Sandbox Code Playgroud)

$ java -version

java version "1.7.0_03"
Java(TM) SE Runtime Environment (build 1.7.0_03-b04)
Java HotSpot(TM) Client VM (build 22.1-b02, mixed mode)
Run Code Online (Sandbox Code Playgroud)

但是,当我运行使用JAX-RS的应用程序并使用JAXB编组一些对象时,我收到以下错误:

Apr 05, 2012 10:45:50 AM com.sun.jersey.api.json.JSONConfiguration natural
SEVERE: NATURAL JSON notation configured, but JAXB RI 2.1.10 not found. For the
recent builds to get this working correctly, you need even …
Run Code Online (Sandbox Code Playgroud)

java linux jax-rs jaxb jersey

7
推荐指数
1
解决办法
7191
查看次数

在Java中支持2个API版本

我正在尝试找到一种方法来支持我的代码库中的两个不同版本的API.它们具有相同的封装名称,但在引擎盖下工作方式有很大不同(两个完全不同的系统).我怎样才能做到这一点?

这两个API也依赖于Bouncy Castle,但它们使用不同的版本.我该如何考虑这一点?

java configuration-management

6
推荐指数
1
解决办法
236
查看次数

如何防止具有META-INF\services\javax.xml.transform.TransformerFactory的xalan.jar接管内置在Xalan实现中的JDK 1.6?

考虑这段代码(完全基于飞碟的"入门"代码,保留其权利):

package flyingsaucerpdf;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

import org.xhtmlrenderer.pdf.ITextRenderer;


    public class PDFMaker {
        public static void main(String[] args) throws Exception {
            new PDFMaker().go();
        }

        public void go() throws Exception {
            String inputFile = "sample.html";
            String url = new File(inputFile).toURI().toURL().toString();
            String outputFile = "firstdoc.pdf";
            OutputStream os = new FileOutputStream(outputFile);

            ITextRenderer renderer = new ITextRenderer();
            renderer.setDocument(url);
            renderer.layout();
            renderer.createPDF(os);

            os.close();
        }
    }
Run Code Online (Sandbox Code Playgroud)

几个事实:

  1. 使用JDK 1.6或1.5独立运行(调用main)非常有效(生成PDF)
  2. 但是当从现有Web应用程序通过URLClassLoader加载时,它会失败,并显示以下错误:

Caused by: org.w3c.dom.DOMException: NAMESPACE_ERR: An attempt is made to create or change an object in …

java xerces classloader xalan

4
推荐指数
1
解决办法
1万
查看次数

我可以在战争中捆绑更新版本的Nashorn吗?

除非我在这里遗漏了一些东西,否则这个版本的Nashorn似乎有一些错误:

$ jjs -v
nashorn 1.8.0_45
Run Code Online (Sandbox Code Playgroud)

它使用3位或更多位的多个积分作为属性键扼流:

$ echo 'var c = JSON.parse("{\"123\": \"a\", \"456\": \"b\"}"); print(c["123"])' | jjs; echo
jjs> java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 7
Run Code Online (Sandbox Code Playgroud)

2位数工作正常:

$ echo 'var c = JSON.parse("{\"12\": \"a\", \"45\": \"b\"}"); print(c["12"])' | jjs; echo
jjs> a
Run Code Online (Sandbox Code Playgroud)

3位数字和2位数字给出了不同的错误:

$ echo 'var c = JSON.parse("{\"123\": \"a\", \"45\": \"b\"}"); print(c["123"])' | jjs; echo
jjs> undefined
Run Code Online (Sandbox Code Playgroud)

3位数字和字符串工作正常:

$ echo 'var c = JSON.parse("{\"123\": \"a\", \"foo\": \"b\"}"); print(c["123"])' | jjs; echo
jjs> a
Run Code Online (Sandbox Code Playgroud)

使用这个版本一切正常:

$ jjs -v …
Run Code Online (Sandbox Code Playgroud)

java nashorn

3
推荐指数
1
解决办法
335
查看次数

Parent Last Classloader 解决Java类路径地狱?

我有一个项目使用两个版本的 bouncyCastle jars bcprov-jdk15 和 bcprov-jdk16。jvm 加载旧版本,但我编写的一个功能需要更新版本才能运行。我尝试使用自定义类加载器来解决这个类路径地狱。经过一番谷歌搜索并在以前的一些 Stackoverflow 答案[1] [2]和本博客的帮助下,我编写了以下Parent Last Class loader ,在委托给父类加载器之前从较新的 jar 中加载类。

public class ParentLastClassLoader extends ClassLoader {

    private String jarFile; //Path to the jar file
    private Hashtable classes = new Hashtable(); //used to cache already defined classes

    public ParentLastClassLoader(ClassLoader parent, String path)
    {
        super(parent);
        this.jarFile = path;
    }

    @Override
    public Class<?> findClass(String name) throws ClassNotFoundException
    {
        System.out.println("Trying to find");
        throw new ClassNotFoundException();
    }

    @Override
    protected synchronized Class<?> loadClass(String className, boolean …
Run Code Online (Sandbox Code Playgroud)

java bouncycastle classpath classloader

2
推荐指数
1
解决办法
5359
查看次数

如何在Java中使用Custom ClassLoader到新的Object

我想创建一个自定义ClassLoader来加载某些路径中的所有jar文件(例如/ home/custom/lib).

那么我希望每次使用newoperator创建一个Object时,它都会在该路径中的所有jar文件中搜索类,然后搜索parameter(-cp)定义的类路径.

可能吗?

例如,有一个jar文件 /home/custom/lib/a.jar

在主类

public class Main {
    public static void main(String[] args) {
        // do something here to use custom ClassLoader
        // here will search Car in /home/custom/lib/a.jar first then in java class path
        Car car = new Car(); 
    }
}
Run Code Online (Sandbox Code Playgroud)

java classloader

2
推荐指数
1
解决办法
2828
查看次数