jar的MANIFEST.MF配置Class-Path, java -classpath设置无效的解决
作者:柳鲲鹏
这篇文章主要介绍了jar的MANIFEST.MF配置Class-Path, java -classpath设置无效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
jar的MANIFEST.MF配置Class-Path, java -classpath设置无效
比如说,
jar的MANIFEST.MF:
Manifest-Version: 1.0 Main-Class: office.Main Class-Path: . ../lib/graphics.jar
运行:
java -classpath .;lib\video.jar -jar Office.jar
表面上看是对的,实际上因为jar中已经包含了Class-Path,所以这样的参数是无效的。吾怎么知道的?因为吾被坑了才知道。
jar包下MANIFEST.MF中的 Class-Path 设置
1. 基本格式
- 属性名称+:+空格+属性值
2. 没行最多72个字符,换行继续必须以空格开头
3. 文件最后必须要有一个回车换行
4. Class-Path 当前路径是jar包所在目录,如果要引用当前目录下一个子目录中的jar包,使用以下格式
- 子目录/xxx.jar 子目录/yyy.jar
- 技巧:多个jar包的引用,可以使用 .classpath 文件中classpathentry 的值
5. 在任何平台上路径分割符都是 /,多个jar包引用以空格分开
Manifest-Version: 1.0 Agent-Class: com.ali.b2b.crm.dynamic.agent.MyAgentMain Main-Class: com.ali.b2b.crm.dynamic.agent.Dynamic Can-Redefine-Classes: true Can-Retransform-Classes: true Boot-Class-Path: javassist.jar Class-Path: lib/tools.jar lib/guava-r09.jar lib/guice-2.0.jar lib/jakarta.commons.lang-2.2.jar lib/jakarta.commons.logging-0.0.0.jar lib/javassist.jar
jar包中MANIFEST.MF相关内容
打包jar包的时候 ,有一个文件夹叫 META-INF/MANIFEST.MF 这个文件里保存一些该jar包的信息. 我们javaagent的相关信息也保存在这个文件中.
还有一个很重要的问题是里面有一个字段叫Class-Path 可以设置调用的jar包路径, 改路径可以写相对路径 , 也就是相对于该jar包的路径
有多个jar包 可以用空格分开 每行内容不能超过70字符
MANIFEST.MF文件可以由maven生成 , 需要在pom文件中设置
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.2.2</version> <configuration> <archive> <!--自动添加META-INF/MANIFEST.MF --> <manifest> <addClasspath>true</addClasspath> </manifest> <manifestEntries> <Premain-Class>org.agent.Agent</Premain-Class> <Can-Redefine-Classes>true</Can-Redefine-Classes> <Can-Retransform-Classes>true</Can-Retransform-Classes> <Class-Path>lib/javassist-3.9.0.jar</Class-Path> </manifestEntries> </archive> </configuration> </plugin> </plugins> </build>
生成的文件内容如下:
Manifest-Version: 1.0 Premain-Class: org.agent.Agent Can-Redefine-Classes: true Can-Retransform-Classes: true Class-Path: lib/javassist-3.9.0.jar Build-Jdk-Spec: 1.8 Created-By: Maven JAR Plugin 3.2.2
参数介绍
Premain-Class
:包含 premain 方法的类(类的全路径名)Agent-Class
:包含 agentmain 方法的类(类的全路径名)Boot-Class-Path
:设置引导类加载器搜索的路径列表。查找类的特定于平台的机制失败后,引导类加载器会搜索这些路径。按列出的顺序搜索路径。列表中的路径由一个或多个空格分开。路径使用分层 URI 的路径组件语法。如果该路径以斜杠字符(“/”)开头,则为绝对路径,否则为相对路径。相对路径根据代理 JAR 文件的绝对路径解析。忽略格式不正确的路径和不存在的路径。如果代理是在 VM 启动之后某一时刻启动的,则忽略不表示 JAR 文件的路径。(可选)Can-Redefine-Classes
:true表示能重定义此代理所需的类,默认值为 false(可选)Can-Retransform-Classes
:true 表示能重转换此代理所需的类,默认值为 false (可选)Can-Set-Native-Method-Prefix
: true表示能设置此代理所需的本机方法前缀,默认值为 false(可选)
即在该文件中主要定义了程序运行相关的配置信息,程序运行前会先检测该文件中的配置项。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。