如何制作可执行的JAR文件?

105

我有一个程序,其中包含两个简单的Java Swing文件。

我怎样才能为我的程序创建可执行的JAR文件?


你在问什么?如何执行jar文件还是如何从jar文件创建可执行文件(像run.cmd这样的一条命令)? - AlikElzin-kilaka
相关内容:http://superuser.com/questions/912955/how-to-make-a-java-jar-file-to-be-a-single-file-executable - AlikElzin-kilaka
5个回答

105

jar文件就是包含一组Java文件的文件。要使jar文件可执行,需要指定jar文件中main类所在的位置。以下是示例代码。

public class JarExample {

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                // your logic here
            }
        });
    }
}

编译你的类。若要创建一个jar文件,您还需要创建一个清单文件(MANIFEST.MF)。例如:

Manifest-Version: 1.0
Main-Class: JarExample

将编译输出的类文件(JarExample.class,JarExample$1.class)和清单文件放在同一个文件夹中。 在命令提示符中,进入文件所在的文件夹,并使用jar命令创建jar文件。 例如(如果您将清单文件命名为jexample.mf)

jar cfm jarexample.jar jexample.mf *.class

这将创建可执行文件jarexample.jar。


48
我的建议是:您不一定需要创建一个清单文件。对于“jar”实用程序,如果您使用标志“_e_”而不是“_m_”,则只需要指定应用程序的入口点(即主类),而不是清单文件。例如:jar cvfe jarexample.jar com.example.jar.JarExample *.class - Powerslave
6
如果您创建MANIFEST.MF文件,请不要忘记在最后一行添加行末换行符。在Windows上,只需在结尾处添加一个空行即可。否则,最后一个属性将无法在jar文件中出现。在这种特殊情况下,Main-Class属性将会丢失。 - David
jar 命令需要单独的路径变量吗?我能够正常使用 javajavac 命令,但是 jar 命令却提示 'jar' 不是内部或外部命令,也不是可运行的程序或批处理文件 的错误信息。 - qwerty
@qwerty 不是的。在Linux上使用命令which,在PowerShell中使用get-command命令来查看您的计算机上实际上的javajavac位置,以及是否存在jar程序。 - user1086516

40

Eclipse 中,您可以按照以下简单步骤完成:

右键单击您的Java项目,然后选择 导出

选择 Java -> 可运行的JAR文件 -> 下一步。

选择启动配置并选择项目文件作为您的 Main class

选择您想要保存它的目标文件夹,然后单击 完成。


启动配置: <MainClasssName> - <ProjectName> - corlaez
2
Eclipse在新包org\eclipse\jdt\internal\jarinjarloader中创建了一堆类(而且该JAR文件与OpenJDK不兼容)。为什么Eclipse要把这个问题复杂化呢? - marcolopes

31

这里是一行:

jar cvfe myjar.jar package.MainClass *.class

其中MainClass是带有main方法的类,packageMainClass所在的包。

请注意,在执行此操作之前,您必须将.java文件编译为.class文件。

c  create new archive
v  generate verbose output on standard output
f  specify archive file name
e  specify application entry point for stand-alone application bundled into an executable jar file

这个答案受 Powerslave 在另一个回答中的评论启发。


1
我遇到了一个错误,Error: Could not find or load main class mtx.testClass Caused by: java.lang.ClassNotFoundException: mtx.testClass - Anton Stafeyev
testClass 是否在你的 .class 文件中定义?确保在运行此命令之前已编译源文件(.java)。通常情况下,类名应该采用 UpperCamelCase 命名规则,你可以尝试将其重命名为 TestClass - River

7
如果你使用Maven,需要在你的 pom.xml 文件中添加以下内容:
<plugin>
    <!-- Build an executable JAR -->
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <archive>
            <manifest>
                <mainClass>com.path.to.YourMainClass</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

接下来可以运行mvn package命令。jar文件将位于target目录中。


比上面的一个变体。 - Vishwa Ratna

4

对于这个问题来说已经太晚了,但如果有人现在正在寻找答案,我已经成功运行且没有错误。

首先,请确保下载并将maven添加到路径中。如果您已经正确地将其添加到路径中,则[mvn --version]将为您提供版本规格。

现在,在maven项目[pom.xml]中添加以下代码,在以下代码中使用您自己的主文件入口点进行替换,例如[com.example.test.Test]。

      <plugin>
            <!-- Build an executable JAR -->
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <archive>
                    <manifest>
                    <mainClass>
            your_package_to_class_that_contains_main_file .MainFileName</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>

现在进入你项目的命令行 [CMD],输入 mvn package 命令,它将会生成一个类似于 ProjectName-0.0.1-SNAPSHOT.jar 的 jar 文件,存储在 target 目录下。

然后使用命令 cd target 进入 target directory 目录。

最后输入命令 java -jar jar-file-name.jar ,如果你的程序没有任何错误,它就可以成功地工作了。


2
这是一个特定于Maven的解决方案,显然对于不使用Maven作为构建系统的人无效。 - Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接