2013-05-28 59 views
2

我有以下目录结构和文件:如何创建罐并执行正确

Folder 
    + 
    |--/org 
    |--Online.java 
    |--Online.class 

当我执行下面的代码:

C:\>cd Folder 
C:\Folder>java Online http://www.google.com google.html 

我的文件执行,并给我正确的输出按我需求。

现在,我想添加包'org'和Online.class文件在一个Jar文件中,例如E.g. Online.jar

我这样做,通过执行以下代码:

jar cvf Online.jar * 

现在,当我试图执行以下代码:

java -jar Online.jar http://www.google.com google.html 

这是我显示错误:

Failed to load Main-Class manifest attribute from Online.jar 

任何人都可以帮助我吗?我想知道这里有什么问题吗?

+0

我是Java新手。任何人都可以帮我解决......在此先感谢 –

+1

.jar只是一个具有特定结构和.class文件的.zip文件。 –

+2

你需要有一个Manifest文件(谷歌它)。 – tilpner

回答

2

看看Java教程页面: Setting an Application's Entry Point

+0

简而言之:创建一个文件夹META-INF(大写),其中MANIFEST.MF带有'Manifest-Version:1.0'换行符'Main- Class:Online'。 –

+0

@popalka这份文件帮助我了解了很多细节。 感谢您为我提供链接。 –

1

我觉得默认的清单可能需要进行修改,以包括主级...

Main-Class: Online.class 
2

这取决于你如何建立你的罐子。您将需要一个清单文件与主类名

我通常使用Ant来构建,所以我生成任务看起来是这样的:

<target name="Build_myjar"> 
     <jar destfile="my.jar" filesetmanifest="mergewithoutmain"> 
      <manifest> 
       <attribute name="Main-Class" value="MyMainClass"/> 
       <attribute name="Class-Path" value="."/> 
      </manifest> 
      <fileset dir="bin"/> 
     </jar> 
    </target> 

通知的清单已经有了MainClass名称,因此,这需要护理调用MainClass

+0

感谢它帮助我构建了我的ant脚本 –

1

假设你FQCN的是org.Online(这是一个有点尴尬)的结构应该是:

Folder 
    + 
    |--org 
    | + 
    | |--Online.class 
    | 
    |--META-INF 
     + 
     |--MANIFEST.MF 

即:

  • 您不必包含Online.java。
  • 将类文件Online.class放在包目录org下。
  • 包含META-INF/MANIFEST.MF

META-INF/MANIFEST.MF的内容应该是:

Manifest-Version: 1.0 
Main-Class: org.Online 

也就是说,指定完全限定类名。

0

我通常使用命令jar -cmf MANIFEST_FILE jarfile.jar *.class并指定一个自定义Manifest文件,因为我得到的错误和您一样。

这是我用的是简单的清单文件(src

Manifest-Version: 1.0 
Class-Path: . 
Main-Class: MainClassName 

Warning: The manifest must end with a new line or carriage return. The last line will not be parsed properly if it does not end with a new line or carriage return.

在运行时,我用java -jar jarfile.jar或只需双击Windows上的.jar。