2016-10-03 64 views
3

我想设置一个罐子清单,因此它加载了一个文件夹旁边的所有库(罐子)。是否有可能有一个罐子清单使用文件夹中的所有罐子

清单如下所示:

Manifest-Version: 1.0 
Class-Path: libs/ 
Main-Class: path.to.my.class.Main 

布局如下:

- MyJar.jar 
- libs/ 
-----lib1.jar 
-----lib2.jar 

而且我试图像这样运行:

java -jar MyJar.jar 

我也得到NoClassDefinition有关文件夹内jar中的类的错误。

如果有人很好奇,该文件夹可能包含在类加载期间处理的可选jar。这是'我不能使用硬编码或自动生成的。

有什么想法?

更新 改写了这个问题,因为这是目前不可能从清单本身。答案是唯一真正可行的,不需要提取罐子,虽然它也可以。

因此,作为总结,答案是否定的,如果您有未指定的依赖关系,则无法单独从清单文件完成。

+0

AFIK JAR的类路径开始于'JAR'文件的根目录。除非要像Spring Boot或OSGI容器那样动态加载它们,否则不能将子类或JAR放在子目录中。 – 11thdimension

+0

原来,可以这样做,你必须用JAR名称指定路径。检查此链接http://todayguesswhat.blogspot.com/2011/03/jar-manifestmf-class-path-referencing.html?_sm_au_=ivVTSRf571T1SvZP – 11thdimension

+0

我早先遇到该链接,我的清单是基于此,但它doesn没有工作。它只能找到该文件夹​​中在类路径中定义的文件。单独的文件夹似乎不起作用。 (即libs /或./libs/) – javydreamercsw

回答

0

java不知道libs目录中的jar文件。 如果您使用的是Java 1.6或更高版本,您可以运行程序作为

java命令的lib/*罐子MyJar.jar

+0

没有按照书面工作。必须这样做:java -cp libs/-jar MyJar.jar。可悲的是,这不是我所问的,因为我试图从清单中看出是否可能。 – javydreamercsw

+0

我结束了使用它的一个版本,使其工作:java -cp libs/* path.to.my.class.Main – javydreamercsw

+0

更新的问题,以容纳这是唯一的vaid答案。 – javydreamercsw

1

尝试提取这些罐子。看起来你不能从目录中添加所有的jar,但你可以添加所有的类。然而,如果你只对jar的代码内容感兴趣,你可能会失去所有的配置。

我测试了这些简单的类

import pkg.B; 

public class A { 
    public static void main(String[] args) { 
    System.out.println(B.class.getName()); 
    } 
} 

package pkg; 

public class B {} 

现在我试着分开的类。我已经将它们震撼到了

$ jar tf libA.jar 
META-INF/ 
META-INF/MANIFEST.MF 
A.class 
$ jar tf libB.jar 
META-INF/ 
META-INF/MANIFEST.MF 
pkg/B.class 

没有任何清单中的类路径。我可以用java -cp libB.jar:libA.jar A运行A.现在,我创建一个类路径的另一个罐子设置为lib/

$ cat manifest 
Class-Path: lib/ 
$ jar cfm empty.jar manifest 

我的目录树看起来像

$ ls -R 
.: 
A.java empty.jar lib lib.jar manifest pkg 

./lib: 
libA.jar libB.jar 

./pkg: 
B.java 

现在我尝试罐子

$ java -jar empty.jar 
Error: Could not find or load main class A 

无望,对不对?然后我提取libA.jar和libB。jar进入lib(与[这个人] [2]相同)。现在一切正常

$ java -jar empty.jar 
pkg.B 
+0

这对我的方案不起作用,因为非技术用户将无法执行此操作。要求他们将jar放在目录中已经够难了。谢谢 – javydreamercsw

相关问题