标签: classloader

确定类来自哪个JAR文件

我现在不在IDE的前面,只是查看API规范.

CodeSource src = MyClass.class.getProtectionDomain().getCodeSource();
if (src != null) {
    URL jar = src.getLocation();
}
Run Code Online (Sandbox Code Playgroud)

我想确定一个类来自哪个JAR文件.这是这样做的吗?

java jar class classloader

146
推荐指数
3
解决办法
8万
查看次数

Java资源作为文件

在Java中是否有办法通过类加载器在jar中检索的资源上构造File实例?

我的应用程序使用jar中的一些文件(默认)或运行时指定的文件系统目录(用户输入).我正在寻找一种一致的方法:
a)将这些文件作为流加载
b)分别列出用户定义目录中的文件或jar中的目录

编辑:显然,理想的方法是完全远离java.io.File.有没有办法从类路径加载目录并列出其内容(包含在其中的文件/实体)?

java resources classloader

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

Java,Classpath,Classloading =>同一个jar /项目的多个版本

我知道这对有经验的程序员来说可能是一个愚蠢的问题.但我有一个库(一个http客户端),我的项目中使用的一些其他框架/ jar需要.但所有这些都需要不同的主要版本,如:

httpclient-v1.jar => Required by cralwer.jar
httpclient-v2.jar => Required by restapi.jar
httpclient-v3.jar => required by foobar.jar
Run Code Online (Sandbox Code Playgroud)

类加载器是否足够智能以某种方式将它们分开?很可能不是吗?如果Class在所有三个jar中都相同,Classloader如何处理这个问题.加载哪一个,为什么?

类加载器是仅仅拾取一个罐子还是任意混合类?因此,例如,如果从Version-1.jar加载一个类,那么从同一个类加载器加载的所有其他类都将进入同一个jar?

你怎么处理这个问题?

是否有一些技巧以某种方式将罐子"合并"到"required.jar"中,以便将它们视为"一个单元/包" Classloader,或以某种方式链接?

java jar classpath classloader

114
推荐指数
5
解决办法
8万
查看次数

如何在jar文件中获取类的名称?

我有一个JAR文件,我需要获取此JAR文件中所有类的名称.我怎样才能做到这一点?

我搜索了它,看到了一些关于JarFile或Java的东西,ClassLoader但我不知道该怎么做.

java jar class file classloader

99
推荐指数
6
解决办法
12万
查看次数

Class.forName()vs ClassLoader.loadClass() - 用于动态加载?

动态加载类时,何时适合使用

Class.forName("SomeClass");
Run Code Online (Sandbox Code Playgroud)

我应该什么时候使用

ClassLoader.getSystemClassLoader().loadClass("SomeClass");
Run Code Online (Sandbox Code Playgroud)

或者,他们是两种做同样事情的方式吗?

java classloader

98
推荐指数
2
解决办法
7万
查看次数

OSGi,Java模块化和拼图

所以截至昨天早上我还没有找到OSGi甚至是什么的线索.OSGi只是一些流行语,我一直看到它一遍又一遍地出现,所以我终于留出一些时间来了解它.

它实际上看起来很酷,所以我想首先说明(对于记录)我在任何方面都不反O​​SGi,这也不是一个"OSGi-bashing"问题.

在一天结束时,似乎OSGi已经 - 实质上 - 解决了Java Modularity上的JSR 277,它认识到JAR文件规范存在缺陷,导致在某些极端情况下命名空间解析和类加载问题.OSGi还做了很多其他非常酷的东西,但从我可以确定的,这是它最大的吸引力(或者其中之一).

对我来说 - 作为一个相当新的(几年前)Java EE开发人员,我们在2011年并且目前生活在Java 7时代,并且这些类加载问题仍然存在,这绝对令人难以置信.特别是在一个应用服务器上可能有数百个JAR的企业环境中,其中许多应用服务器依赖于彼此的不同版本,并且所有应用服务器同时运行(或多或少).

我的问题:

和我在OSGi中一样感兴趣,并且我想开始了解它以了解它在哪里/是否可以用于我的项目,我只是没有时间坐下来学习大的东西,至少现在.

那么当这些问题出现时,非OSGi开发人员会做些什么呢?目前存在哪些Java(Oracle/Sun/JCP)解决方案?为什么Jigsaw从J7切入?Jigsaw明年将在J8实施的社区有多确定?即使它不是Java平台的一部分,是否有可能为您的项目获得Jigsaw?

我想我在这里问的是恐慌,阴谋和一个facepalm的组合.现在我终于明白了OSGi是什么,我只是不"得到"像Jigsaw这样的东西需要20多年才能实现,然后才能从发布中获得.这看起来很基本.

而且,作为开发人员,我也很好奇我的解决方案是什么,没有OSGi.

另外,注意:我知道这不是一个" 纯编程 "类型的问题,但是在你们中的一些人让你的鼻子弯曲变形之前,我想说明(再次,为了记录)我故意把这个问题放在所以.那是因为我对我的同伴SOE只有最大的尊重,我正在寻找一些我所看到的每天潜伏在这里的"IT之神"的建筑级答案.

但是,对于那些绝对坚持使用某些代码段支持SO问题的人:

int x = 9;
Run Code Online (Sandbox Code Playgroud)

(感谢任何能够权衡这个OSGi/Jigsaw/classloader/namespace/JAR地狱的人!)

java osgi classloader java-platform-module-system

95
推荐指数
3
解决办法
9615
查看次数

如何使用Maven将所有必需的JAR文件放在最终JAR文件中的库文件夹中?

我在我的独立应用程序中使用Maven,并且我想将我的JAR文件中的所有依赖项打包到库文件夹中,如下面的答案中所述:

如何使用Maven创建具有依赖关系的可执行JAR?

我希望我的最终JAR文件有一个库文件夹,其中包含作为JAR文件的依赖项,而不是maven-shade-plugin将依赖项放在.m2文件夹中的Maven层次结构等文件夹形式的内容.

好吧,实际上当前的配置做了我想要的,但是我在运行应用程序时加载JAR文件时遇到了问题.我无法加载课程.

这是我的配置:

<plugins>

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <executions>
            <execution>
                <id>copy-dependencies</id>
                <phase>prepare-package</phase>
                <goals>
                    <goal>copy-dependencies</goal>
                </goals>
                <configuration>
                    <outputDirectory>${project.build.directory}/classes/lib</outputDirectory>
                    <overWriteReleases>false</overWriteReleases>
                    <overWriteSnapshots>false</overWriteSnapshots>
                    <overWriteIfNewer>true</overWriteIfNewer>
                </configuration>
            </execution>
        </executions>
    </plugin>

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
            <archive>
                <manifest>
                    <addClasspath>true</addClasspath>
                    <classpathPrefix>lib/</classpathPrefix>
                    <mainClass>com.myapp.MainClass</mainClass>
                </manifest>
            </archive>
        </configuration>
    </plugin>

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>1.6</source>
            <target>1.6</target>
        </configuration>
    </plugin>

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <executions>
            <execution>
                <id>install</id>
                <phase>install</phase>
                <goals>
                    <goal>sources</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.5</version>
        <configuration>
            <encoding>UTF-8</encoding>
        </configuration>
    </plugin>

</plugins>
Run Code Online (Sandbox Code Playgroud)

该项目从Eclipse运行良好,JAR文件根据我的需要放在我最终的JAR文件中的库文件夹中,但是当从目标文件夹运行最终的JAR文件时,我总是得到ClassNotFoundException:

Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext
Caused …
Run Code Online (Sandbox Code Playgroud)

java build-process jar classloader maven

95
推荐指数
5
解决办法
19万
查看次数

如何正确使用ClassLoader.getResources()?

如何使用ClassLoader.getResources()从类路径中查找recursivly资源?

例如

  • 找到META-INF"目录" 中的所有资源:想象一下

    getClass().getClassLoader().getResources("META-INF")

    不幸的是,这只会检索URL到这个"目录".

  • 所有资源命名bla.xml(recursivly)

    getClass().getClassLoader().getResources("bla.xml")

    但是这会返回一个空的Enumeration.

并作为一个奖金问题:如何ClassLoader.getResources()区别ClassLoader.getResource()

java resources classpath classloader getresource

78
推荐指数
5
解决办法
19万
查看次数

如何在运行时加载jar文件

我被要求构建一个能够在运行时加载新代码(扩展)的java系统.在代码运行时如何重新加载jar文件?或者我如何装一个新的罐子?

显然,由于恒定的正常运行时间很重要,我想添加在其中重新加载现有类的能力(如果它不会使事情复杂化太多).

我应该注意什么?(把它想象成两个不同的问题 - 一个关于在运行时重新加载类,另一个关于添加新类).

java runtime jar classloader

72
推荐指数
3
解决办法
15万
查看次数

是否可以在运行时从Android应用程序动态加载库?

有没有办法让Android应用程序在运行时下载和使用Java库?

这是一个例子:

想象一下,应用程序需要根据输入值进行一些计算.应用程序请求输入这些值,然后检查所需的Classes或Methods是否可用.

如果没有,它将连接到服务器,下载所需的库,并在运行时加载它以使用反射技术调用所需的方法.实施可能会根据各种标准(例如下载库的用户)而发生变化.

reflection android classloader dalvik android-library

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