【问题标题】:Building Runnable Jar from Project with Main Method in External Jar FIle使用外部 Jar 文件中的 Main 方法从项目构建可运行 Jar
【发布时间】:2012-09-19 20:11:59
【问题描述】:

我的教授决定为这个作业提供一个包含主要方法的外部 jar,我们应该为后端编写代码。我把这个 jar 放到我的项目中并让它在 Eclipse 中运行没有问题,但是当我尝试导出一个可运行的 jar 时,我得到了这个错误:

“在给定的启动配置中找不到主要方法”

这似乎很荒谬,因为它肯定可以在我在 Eclipse 中运行它时找到主要方法,我错过了什么?我已经尝试打开 jar 以获取 Manifest.mf 文件并为其提供外部 jar 内部的 main 类的名称,但它仍然无法找到它。

我也将 jar 添加到项目构建路径和类路径中,但这似乎没有什么区别。

清单文件只是说:

Manifest-Version: 1.0
Class-Path: .

我认为这是错误的,但我该如何正确设置?

-- 编辑--

这是我构建时由 Eclipse 生成的 ANT 文件:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project default="create_run_jar" name="Create Runnable Jar for Project Lab 1">
<!--this file was created by Eclipse Runnable JAR Export Wizard-->
<!--ANT 1.7 is required                                        -->
<target name="create_run_jar">
    <jar destfile="C:/lab.jar" filesetmanifest="mergewithoutmain">
        <manifest>
            <attribute name="Main-Class" value="edu.wmich.cs1120.la1.solution_gui.MainWindow"/>
            <attribute name="Class-Path" value="."/>
        </manifest>
        <zipfileset excludes="META-INF/*.SF" src="C:/LA1_GUI.jar"/>
        <fileset dir="C:/bin"/>
    </jar>
</target>

好的,我知道 Main-Class 属性需要设置什么,所以当我编辑 Manifest.mf 以反映它有效时!但我仍然感到困惑,尤其是以下几行:

filesetmanifest="mergewithoutmain"
zipfileset excludes

如果我为我的项目指定了 main,为什么要这样做?

【问题讨论】:

    标签: java eclipse jar classpath external


    【解决方案1】:

    类路径为 '.'在您的清单中,您需要将教授提供的 jar 放在您尝试从中运行创建的 jar 的同一目录中。否则可能有一种方法可以告诉 eclipse/ant 包含所有依赖项。

    -更新- 由于您使用的是依赖项中的 Main 方法,因此您应该在 ant build xml 中指定以下内容,然后重新构建。

     filesetmanifest="merge"
    

    这将在另一个清单的主要部分合并到您的新 jar 清单中。

    【讨论】:

    • 但是在创建的 jar 里面是从他的外部 jar 解压/重新打包的类文件。为什么不直接使用这些?
    • 嗯,是的,在这种情况下,我认为它应该可以工作。您是创建了自己的 Main 方法,还是使用了教授 jar 中提供的 Main 方法?
    • 如果您可以编辑该 ant 文件,请将文件 filesetmanifest 更改为 filesetmanifest="merge" 然后重新运行,看看是否有任何变化。
    • 教授的 jar 和 @aglassman 中提供的 Main 我很想尝试,但我不知道如何使用 ant 文件在 Eclipse 中构建项目:(
    • ant文件生成后存放在哪里?如果在eclipse中可以看到,应该可以右键点击,然后选择Run As>ant build.
    【解决方案2】:

    有几种方法可以独立于 Eclipse 运行程序:

    1. 使用 Ant,正如您已经学习的那样。

    2. 使用命令行。无论您是在自己的 jar 文件中包含教授的类文件还是有两个单独的 jar 文件,确切的命令都会有所不同:

      一个。只需一个jar文件,就可以运行

      java -jar MyJar.jar
      

      这假设您在清单文件中设置了 Main-Class 属性。如果没有,可以手动指定主类:

      java -jar MyJar.jar MainClass
      

      b.使用两个 jar,您只需要确保第二个 jar 包含在类路径中:

      java -jar ProfsJar.jar -cp MyJar.jar
      

      同样,如果需要,您可以手动指定主类:

      java -jar ProfsJar.jar -cp MyJar.jar MainClass
      
    3. 双击操作系统的文件资源管理器。如果您的 Java 安装已正确配置您的操作系统,您只需双击 jar 文件即可。这还假设在 jar 的清单中正确设置了 Main-Class 属性。

    【讨论】:

    • 我知道这些方法,但我的问题是为什么 Eclipse 会错误地构建 jar 文件。根据您的 3)“这也假定在 jar 的清单中正确设置了 Main-Class 属性”为什么当我尝试构建一个必须使用外部 jar 作为主要的可运行 jar 时 Eclipse 没有正确设置它?跨度>
    • @user1684045 我不使用 Eclipse,所以我无法开始猜测这种行为。我在这里的回答是为了回答您关于在没有 Ant 的情况下运行程序的问题(在评论中)。也许我误解了。 (而且这个答案可能仅在原始问题的上下文中才有意义......)
    • 没问题,也许我会在 eclipse 板上发帖,看看他们对这一切的看法
    猜你喜欢
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    • 2010-10-04
    • 2015-02-06
    相关资源
    最近更新 更多