2017-05-11 69 views
0

如何确定动态加载我的罐子的罐子的名称?可能吗?我尝试了许多使用ClassLoader的变体,但没有成功。确定动态加载的罐子的加载器罐子

在此先感谢。

让我解释一下为什么我需要“loader jar”的名字。在我们的容器,我们有下面几行:

URLClassLoader classLoader = new URLClassLoader(new URL[] { artifact.getFile().toURI().toURL() }); 
Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class); 
method.setAccessible(true); 
method.invoke(classLoader, artifact.getArtifact().getFile().toURI().toURL()); 
Class<?> processorClass = classLoader.loadClass(className); 
Object processorClassInstance = processorClass.newInstance(); 

当加载的类实例化时,上面的newInstance,它的属性文件是外部类所在的罐子。配置文件位于一个以包含执行上面代码行的类的容器jar命名的目录中。因此,如果部署的容器jar名为RedcapTDP.jar,则配置文件位于“C:... \ RedcapTDP”中。当部署RedcapTDP.jar时,它会动态加载配置的Maven工件,然后它将从RedcapTDP目录读取它的配置文件。

我希望说清楚!

+0

'class processorClass = classLoader.loadClass(className);'这样这个行返回的类,在instatiated需要从一个依赖于上面知道的'artifact'的名称的目录加载配置吗? – Strelok

+0

它将根据包含执行该代码行的类的jar名称从目录加载配置。 – user481779

回答

1

如何确定动态加载我的jar的jar名称?可能吗?

从字面上看,不,它显然是不可能的。事实上,它甚至没有意义。 Java根本不会“加载”Jars,尽管它可能会加载一个或多个包含在jar中的类。当它这样做时,它是VM加载类,而不是任何jar加载它。

解释你更宽松一点,也许你问:“我如何确定其依赖于我的jar中的一个类导致我的类被加载,以及如何确定从哪个jar其他课程被加载的文件?“除非你的控件超出了jar中的类,否则这是不可能的。

加载是类初始化之前的一个单独的步骤,类初始化是有任何机会执行任何代码包含在您的类中的第一个点。因此,当你的课堂第一次有机会询问任何事情时,课堂加载不再是持续的。此外,班级并不一定是从罐子装载的,无论如何,他们都不会提供关于他们装载来源的信息。

我或许可以走到更远的地方,猜测你可能会问什么,但我看不出有什么解释的问题提供了不同于“不,这是不可能的”的答案。

+0

请参阅上文。我编辑帖子来描述为什么我需要容器jar的名字。 – user481779

+0

没关系*为什么*你想要它,@ user481779。滚石对你有一些话:你不能总是得到你想要的。 –

+0

谢谢你的明确答案。我想我们会找到另一种方式。再次感谢你的回复。 – user481779

0

JAR不加载JAR。一个jar文件只是一个无意义的容器,有助于将类文件和其他资源放在一起。类由类加载器从提供给jvm的类路径加载。你想要做的是不可能的。也许你可以解释你想要达到的目标,也许有更好的方法去实现它。

+0

见上文。我编辑帖子来描述为什么我需要容器jar的名字。 – user481779