Java 使用外部Jar文件中的Main方法从项目构建可运行的Jar

Java 使用外部Jar文件中的Main方法从项目构建可运行的Jar,java,eclipse,jar,classpath,external,Java,Eclipse,Jar,Classpath,External,我的教授已经决定为这个任务提供一个带有主方法的外部jar,我们应该为后端编写代码。我将这个jar放入我的项目并让它在Eclipse中运行没有问题,但是当我尝试导出一个可运行的jar时,我得到了以下错误: “无法从给定的启动配置中找到主方法” 这看起来很可笑,因为每当我在Eclipse中运行它时,它肯定能找到主方法,我缺少了什么?我尝试打开jar以获取Manifest.mf文件,并为其提供外部jar中主要的类的名称,但它仍然找不到它 我已经将jar添加到项目构建路径和类路径中,但这似乎没有什么区别

我的教授已经决定为这个任务提供一个带有主方法的外部jar,我们应该为后端编写代码。我将这个jar放入我的项目并让它在Eclipse中运行没有问题,但是当我尝试导出一个可运行的jar时,我得到了以下错误:

“无法从给定的启动配置中找到主方法”

这看起来很可笑,因为每当我在Eclipse中运行它时,它肯定能找到主方法,我缺少了什么?我尝试打开jar以获取Manifest.mf文件,并为其提供外部jar中主要的类的名称,但它仍然找不到它

我已经将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,为什么要这样做呢?

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

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

 filesetmanifest="merge"

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

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

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

 filesetmanifest="merge"

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

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

  • 使用Ant,正如您已经了解的那样

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

    a。使用单个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
    
  • 双击操作系统的文件资源管理器。如果Java安装正确配置了操作系统,只需双击jar文件即可。这还假设在jar的清单中正确设置了Main Class属性


  • 有几种独立于Eclipse运行程序的方法:

  • 使用Ant,正如您已经了解的那样

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

    a。使用单个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
    
  • 双击操作系统的文件资源管理器。如果Java安装正确配置了操作系统,只需双击jar文件即可。这还假设在jar的清单中正确设置了Main Class属性


  • 但是在创建的jar内部是从外部jar解包/重新打包的类文件。为什么不直接用这些呢?嗯,是的,那样的话,我想应该能用。您是创建了自己的Main方法,还是使用了professor's jar中提供的Main方法?如果您可以编辑该ant文件,请将文件filesetmanifest更改为filesetmanifest=“merge”,然后重新运行,看看这会不会改变什么。professor's jar和@aglassman中提供的Main我很想尝试一下,但我不知道如何使用ant文件在Eclipse中构建项目:(ant文件生成后存储在哪里?如果您可以在eclipse中看到它,您应该能够右键单击它,然后选择Run As>ant build。但是在创建的jar中是来自外部jar的解包/重新打包类文件。为什么它不使用这些文件呢?嗯,是的,在这种情况下它应该可以工作。您创建了自己的jar吗n Main方法,或者您正在使用professor's jar中提供的Main方法?如果您可以编辑该ant文件,请将文件filesetmanifest更改为filesetmanifest=“merge”然后重新运行,看看这是否会改变什么。professor's jar和@aglassman中提供的Main我很想尝试一下,但我不知道如何使用ant文件在Eclipse中构建项目:(ant文件生成后存储在哪里?如果您可以在eclipse中看到它,您应该能够右键单击它,然后选择Run As>ant build。我知道这些方法,但我的问题是为什么eclipse不正确地构建jar文件。根据您的3)“这还假设在jar的清单中正确设置了Main Class属性”当我试图构建一个必须使用外部jar作为主jar的可运行jar时,为什么Eclipse没有正确设置它?@user1684045我不使用Eclipse,所以我不能开始猜测这个行为。我的答案是为了回答你的问题(在评论中)关于在没有Ant的情况下运行程序。也许我误解了。(这个答案可能仅在原始问题的上下文中没有意义。)。。