免责声明:鉴于这个问题,这可能不是最佳解决方案,但我很好奇如何实现这一实施.
问题我正在尝试处理一些遗留代码,这些代码的单例定义如下:
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,那么我必须以 …
我想我理解类加载层次结构是如何工作的.(JVM首先查看父层次结构)
所以我想创建一个ClassLoader,或者使用一个完全独立的范围的现有库,而不是查看父ClassLoading层次结构.实际上我正在寻找启动单独JVM的相同效果,但实际上没有这样做.
我有信心这是可能的,但是很难找到一个如何做到这一点的简单例子.
我正在使用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) 我正在尝试找到一种方法来支持我的代码库中的两个不同版本的API.它们具有相同的封装名称,但在引擎盖下工作方式有很大不同(两个完全不同的系统).我怎样才能做到这一点?
这两个API也依赖于Bouncy Castle,但它们使用不同的版本.我该如何考虑这一点?
考虑这段代码(完全基于飞碟的"入门"代码,保留其权利):
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)
几个事实:
Caused by: org.w3c.dom.DOMException: NAMESPACE_ERR: An attempt is made to create or change an object in …
除非我在这里遗漏了一些东西,否则这个版本的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) 我有一个项目使用两个版本的 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) 我想创建一个自定义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)