【问题标题】:Assigning a version to a jar file将版本分配给 jar 文件
【发布时间】:2015-02-28 00:51:35
【问题描述】:

简单的问题:我想在每次向客户发布新的 jar 文件时分配一个新版本\内部版本号。

我知道涉及到一个清单文件,但到目前为止我尝试过的任何版本都无法获得该版本。

我的 jar 项目在一个常见的“com”包下有两个包:“main”和“loginRequest”。

我的主类(“Main”)在“main”包下。

我的清单文件是:

Manifest-Version: 1.0
Main-Class: main.Main
Specification-Version: 1.1

我尝试使用 eclipse 构建 jar(不包括 src 文件),包括清单。

我还尝试了以下方法:

jar -cvfm v11_4_WebExClientEE.jar ..\..\v11_4_WebExClientEE.mf main\Main.class 

让我重蹈覆辙

"added manifest

 adding: main/Main.class(in = 1206) (out= 677)(deflated 43%)"

然后:

java -jar v11_4_WebExClientEE.jar

它让我回来了

Exception in thread "main" java.lang.NoClassDefFoundError: main/Main (wrong name: com/main/Main)

等等

在我的主类 ctor 中,我添加了:

    Package p = this.getClass().getPackage();

    System.out.println("v11_4_WebExClientEE spec Version : " + p.getSpecificationVersion());

你能建议吗?

谢谢!

【问题讨论】:

  • 你的主类所在的包是什么?您确定需要清单版本而不是 v11_4_WebExClientEE-.jar 之类的吗?
  • 名为Main的主类位于“main”包下。你建议我应该在 jar 名称中添加版本号吗?
  • 是的。这样,您可以在集中存储库中维护各种版本,并让您的客户通过 maven/ivy 从该存储库中获取。
  • 对,但是这样每次我用新的 jar 更改 jar 名称时,他都必须更新它的项目类路径。如果可能的话,我宁愿避免它......
  • 如果你有两个 jars 并且你想检查最新的一个,你会遍历 jar 的清单吗?如果只是类路径,则可以使用通配符。

标签: java eclipse jar manifest


【解决方案1】:

您做错了什么的线索在异常消息中:

... NoClassDefFoundError: main/Main(错误名称:com/main/Main)

JVM 已找到您的入口点类的条目(根据您的“Main-Class”属性),但类加载器抛出了 JAR 条目路径名与您的类的完整包名不匹配的异常。 (类加载器期待“main/Main”,但实际包名是“/com/main/Main”...根据类文件内容。)

按照我提供的详细信息,应该是 com/main/*.class 吗?

是的。这就是您应该在jar 命令行上添加的内容,以添加具有正确 JAR 路径的类。 (或者至少是类似的东西。关键是参数应该对应于 JAR 文件所需的完整条目路径;即完全限定的类名。)

我应该用什么代替 java/util/ 和 java.util ?

Name 属性可能根本不应该存在。 “名称”属性为 JAR 文件中的条目引入了清单部分。

“Implementation-Title”属性纯粹是描述性的。你可以放任何你想要的东西。

在继续之前,我强烈建议您阅读JAR file specification仔细。请注意规范中有关清单语法的内容,以及清单属性的含义。

【讨论】:

  • 谢谢斯蒂芬。当您提供 ang 收到以下内容时,我更新了 jar 命令: com\main*.class :未添加此类文件或目录清单。 main 后面有反斜杠(!)虽然你可能看不到它的评论...目录结构是 c:\Users\\Documents\eclipse\\bin\com\main\
【解决方案2】:

我们首先创建一个名为 Manifest.txt 的文本文件,其内容如下:

Name: com/main/
Specification-Title: Main Common Class
Specification-Version: 1.2
Specification-Vendor: Example Tech, Inc.
Implementation-Title: com.main 
Implementation-Version: build57
Implementation-Vendor: Example Tech, Inc.

然后我们通过输入以下命令创建一个名为 MyJar_1.2.jarJAR 文件:

jar cfm MyJar_1.2.jar Manifest.txt MyPackage/*.class

【讨论】:

  • 对不起,我没有完全理解你的建议。你能给我一个例子吗?谢谢
  • 是的,我在网上看到了这个例子并试过了。我认为我的问题是我不确切知道要放置哪个值而不是 MyPackage。按照我提供的详细信息,它应该是 com/main/*.class 吗?我应该用什么代替 java/util/ 和 java.util ?有关系吗?
  • 你可以删除 Implementation-Title:,如果你想在实现其他包时使用它,是的 com/main/*.class 应该可以工作
猜你喜欢
  • 2012-10-09
  • 2020-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-11
  • 1970-01-01
相关资源
最近更新 更多