Java 将版本分配给jar文件

Java 将版本分配给jar文件,java,eclipse,jar,manifest,Java,Eclipse,Jar,Manifest,简单问题:每次我向我的客户发布一个新的jar文件时,我想分配一个新的版本号 我知道涉及到一个manufest文件,但无论我到目前为止尝试了什么,我都无法获得该版本 我的jar项目在一个通用的“com”包下有两个包:“main”和“loginRequest” 我的主类(“main”)在“main”包下 我的清单文件是: Manifest-Version: 1.0 Main-Class: main.Main Specification-Version: 1.1 我尝试使用eclipse(不包括sr

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

我知道涉及到一个manufest文件,但无论我到目前为止尝试了什么,我都无法获得该版本

我的jar项目在一个通用的“com”包下有两个包:“main”和“loginRequest”

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

我的清单文件是:

Manifest-Version: 1.0
Main-Class: main.Main
Specification-Version: 1.1
我尝试使用eclipse(不包括src文件)构建jar,包括清单

我还尝试了以下方法:

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)
等等

在我的主要课堂上,我补充道:

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

    System.out.println("v11_4_WebExClientEE spec Version : " + p.getSpecificationVersion());
你能给个建议吗


谢谢

我们首先创建一个名为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

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

。。。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属性可能根本不应该存在。“Name”属性为JAR文件中的条目引入清单部分

“实现标题”属性纯粹是描述性的。你想放什么就放什么


在您继续之前,我强烈建议您仔细阅读。请注意规范中关于清单语法的说明,以及清单属性的含义。

主类所在的包是什么?您确定需要清单版本而不是像v11_4_WebExClientEE-.jar这样的东西吗?名为main的主类位于包“main”下。你建议我在jar名称中添加版本号吗?是的。通过这种方式,您可以在集中式存储库中维护各种版本,并让您的客户机通过maven/ivy.Right从该存储库中获取,但通过这种方式,每次我用新jar更改jar名称时,他都必须更新它的项目类路径。如果可能的话,我宁愿避免这样做……所以,如果您有两个jar,并且您想要检查最新的一个,那么您将遍历jar的清单吗?如果只是类路径,您可以使用通配符。对不起,我没有完全理解您的建议。你能给我举个例子吗?谢谢,我在网上看到了这个例子并尝试了一下。我想我的问题是我不知道应该把哪个值替换成我的包。按照我给出的细节,它应该是com/main/*.class吗?我应该放什么来代替java/util/和java.util?这有关系吗?如果您想在实现其他包时使用它,您可以删除实现标题:,是的,com/main/*。类应该可以工作。当您收到以下内容时,我更新了jar命令:com\main*.class:没有添加这样的文件或目录清单。main后面有反斜杠(!),尽管你可能在评论中看不到它。。。目录结构为c:\Users\\Documents\eclipse\\bin\com\main\