类org.springframework.boot.loader.LaunchedURLClassLoader源码实例Demo

下面列出了怎么用org.springframework.boot.loader.LaunchedURLClassLoader的API类实例代码及写法,或者点击链接到github查看源代码。

@Override
protected ClassLoader createClassLoader(URL[] urls) throws Exception {
    // The spring classloader should not be built on top of the current classloader, it should just share the test classes if available
    List<URL> parentUrls = Arrays.asList(urlsFromClassLoader(this.getClassLoader()));
    List<URL> additionalURLs = parentUrls.stream().filter(u -> u.toString().startsWith("file") && !u.toString().endsWith(".jar")).collect(Collectors.toList());

    ArrayList<URL> newURLs = new ArrayList(Arrays.asList(urls));
    newURLs.addAll(additionalURLs);

    ClassLoader appClassLoader = null;
    // Until https://github.com/spring-projects/spring-boot/issues/12832 is resolved
    if (getJavaMajorVersion() >= 9) {
        // use the Platform classloader to resolve classes on the module path
        appClassLoader = getClass().getClassLoader().getParent();
    }
    LaunchedURLClassLoader launchedURLClassLoader = new LaunchedURLClassLoader(newURLs.toArray(new URL[0]), appClassLoader);
    return launchedURLClassLoader;
}
 
@Override
public boolean process(ApplicationExchange application, LauncherFilterChain filterChain) {

    int port = application.getServerPort();

    ClassLoader classLoader = new LaunchedURLClassLoader(application.getClassPathUrls(), deduceParentClassLoader());

    DeploymentInfo servletBuilder = Servlets.deployment()
                   .setClassLoader(classLoader)
                   .setContextPath(application.getContextPath())
                   .setDeploymentName(application.getApplication().getPath());

    DeploymentManager manager = Servlets.defaultContainer().addDeployment(servletBuilder);
 
    manager.deploy();

    Undertow server = null;
    try {
        server = Undertow.builder()
                .addHttpListener(port, "localhost")
                .setHandler(manager.start()).build();
        server.start();
    } catch (ServletException e) {
        e.printStackTrace();
    }

    return false;
}
 
源代码3 项目: java-agent   文件: SpringBootRuleITest.java
@Test
public void testFindOpenTracingAgentRules() throws Exception {
    File f = new File(System.getProperty("rules.path"));
    URL[] urls = new URL[1];
    urls[0] = f.toURI().toURL();

    try (LaunchedURLClassLoader loader = new LaunchedURLClassLoader(urls,
            ClassLoader.getSystemClassLoader())) {

        assertNotNull(loader.getResource("test.rule"));
    }
}
 
源代码4 项目: util4j   文件: ScriptUtil.java
public Class<?> buildClass(String className,String script)throws Exception{
    URL[] urls=new URL[paths.size()];
    for (int i = 0; i < paths.size(); i++) {
        String path=paths.get(i);
        URL url=new File(path).toURI().toURL();
        urls[i]=url;
    }
    LaunchedURLClassLoader classLoader = new LaunchedURLClassLoader(urls, Thread.currentThread().getContextClassLoader());
    DynamicCompiler dynamicCompiler = new DynamicCompiler(classLoader);
    dynamicCompiler.addSource(className,script);
    Map<String,Class<?>> map=dynamicCompiler.build();
    Class<?> clazz=map.get(className);
    return clazz;
}
 
源代码5 项目: util4j   文件: ScriptUtil.java
public byte[] buildClassBytes(String className,String script)throws Exception{
    URL[] urls=new URL[paths.size()];
    for (int i = 0; i < paths.size(); i++) {
        String path=paths.get(i);
        URL url=new File(path).toURI().toURL();
        urls[i]=url;
    }
    LaunchedURLClassLoader classLoader = new LaunchedURLClassLoader(urls, Thread.currentThread().getContextClassLoader());
    DynamicCompiler dynamicCompiler = new DynamicCompiler(classLoader);
    dynamicCompiler.addSource(className,script);
    Map<String, byte[]> map = dynamicCompiler.buildByteCodes();
    byte[] clazz=map.get(className);
    return clazz;
}
 
@Override
protected ClassLoader createClassLoader(URL[] urls) throws Exception {
	String classAsPath = DeployerContextUtils.class.getName().replace('.', '/') + ".class";
	byte[] deployerContextUtilsBytes = StreamUtils
			.copyToByteArray(DeployerContextUtils.class.getClassLoader().getResourceAsStream(classAsPath));
	/*
	 * While LaunchedURLClassLoader is completely disconnected with the current
	 * class loader, this will ensure that certain classes (e.g., org.reactivestreams.* see #shouldLoadViaDeployerLoader() )
	 * are shared across two class loaders.
	 */
	final ClassLoader deployerClassLoader = getClass().getClassLoader();
	this.archiveLoader = new LaunchedURLClassLoader(urls, deployerClassLoader.getParent()) {
		@Override
		public Class<?> loadClass(String name) throws ClassNotFoundException {
			Class<?> clazz = null;
			if (shouldLoadViaDeployerLoader(name)) {
				clazz = deployerClassLoader.loadClass(name);
			}
			else if (name.equals(DeployerContextUtils.class.getName())) {
				/*
				 * This will ensure that `DeployerContextUtils` is available to
				 * foreign class loader for cases where foreign JAR does not
				 * have SCF dependencies.
				 */
				try {
					clazz = super.loadClass(name, false);
				}
				catch (Exception e) {
					clazz = defineClass(name, deployerContextUtilsBytes, 0, deployerContextUtilsBytes.length);
				}
			}
			else {
				clazz = super.loadClass(name, false);
			}
			return clazz;
		}
	};
	return this.archiveLoader;
}
 
源代码7 项目: spring-cloud-formula   文件: FormulaLauncher.java
@Override
protected ClassLoader createClassLoader(URL[] urls) {
    logger.info("creating class loader with urls: {}", Arrays.asList(urls));
    return new LaunchedURLClassLoader(urls, deduceParentClassLoader());
}
 
源代码8 项目: liiklus   文件: ApplicationRunner.java
@SneakyThrows
public ConfigurableApplicationContext run() {
    System.setProperty("plugins.dir", findPluginsDir().getAbsolutePath());
    System.setProperty("plugins.pathMatcher", "*/build/libs/*.jar");

    var tempFile = Files.createTempFile("app", ".jar");
    tempFile.toFile().deleteOnExit();
    try (var appJarStream = getClass().getClassLoader().getResourceAsStream("app-boot.jar")) {
        Files.copy(appJarStream, tempFile, StandardCopyOption.REPLACE_EXISTING);
    }

    var launcher = new JarLauncher(new JarFileArchive(tempFile.toFile(), tempFile.toUri().toURL())) {

        ClassLoader createClassLoader() throws Exception {
            return super.createClassLoader(getClassPathArchives());
        }

        @Override
        protected ClassLoader createClassLoader(URL[] urls) throws Exception {
            var systemClassLoader = ClassLoader.getSystemClassLoader();
            return new LaunchedURLClassLoader(urls, systemClassLoader.getParent()) {

                @Override
                protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
                    var classFile = findResource(name.replace(".", "/") + ".class");
                    if (classFile != null) {
                        // If exists in the app.jar, load it from the system classloader instead
                        log.debug("Loading class '{}' from the system ClassLoader instead", name);
                        return systemClassLoader.loadClass(name);
                    }
                    return super.loadClass(name, resolve);
                }
            };
        }
    };

    var currentClassLoader = Thread.currentThread().getContextClassLoader();
    try {
        var appClassLoader = launcher.createClassLoader();
        Thread.currentThread().setContextClassLoader(appClassLoader);

        var applicationClass = appClassLoader.loadClass("com.github.bsideup.liiklus.Application");

        var createSpringApplicationMethod = applicationClass.getDeclaredMethod("createSpringApplication", String[].class);

        var application = (SpringApplication) createSpringApplicationMethod.invoke(null, (Object) new String[0]);
        application.setDefaultProperties(properties);
        return application.run();
    } finally {
        Thread.currentThread().setContextClassLoader(currentClassLoader);
    }
}
 
@Override
protected ClassLoader createClassLoader(URL[] urls) throws Exception {
	return new LaunchedURLClassLoader(urls, parent);
}
 
@Override
protected ClassLoader createClassLoader(URL[] urls) throws Exception {
	return new LaunchedURLClassLoader(urls, parent);
}
 
 类所在包
 同包方法