【问题标题】:How does Java decide where to look for the main class?Java 如何决定在哪里寻找主类?
【发布时间】:2013-03-10 14:25:12
【问题描述】:

我在一个名为“staged”的文件夹中有一堆 .jar 文件。

/target
  /staged
    - akka-slf4j_2.10.0-RC1-2.1.0-RC1.jar
    - play_2.10-2.1-RC1.jar
    - etc...

虽然我的当前目录是“目标”,但我尝试运行命令

$ java -cp ./staged/* play.core.server.NettyServer ./..
Error: Could not find or load main class ..staged.akka-slf4j_2.10.0-RC1-2.1.0-RC1.jar

奇怪的是,Java 在 staged.akka-slf4j_2.10.0-RC1-2.1.0-RC1.jar 中寻找一个主类。 NettyServer 类位于名为 play_2.10-2.1-RC1.jar 的完全不同的 .jar 文件中。 Java 如何决定搜索哪些 .jar 文件以找到 main 方法?

【问题讨论】:

    标签: java classpath


    【解决方案1】:

    MANIFEST.MF 中你必须写这样一行:

    Main-Class: MyPackage.MyClass
    

    然后把这个 Manifest 添加到你的 jar 中,jar 就知道去哪里找了。

    【讨论】:

    • 请注意,只有当您使用-jar 选项来运行您的 Java 程序(运行可执行 JAR)时,才会使用此选项。
    【解决方案2】:

    Java 不搜索特定的 jar 文件。它只是在生成的类路径中搜索您在命令行中指定的类。

    编辑:除非您指定“-jar”,否则它会使用 MANIFEST.MF 文件的 Main-Class 指令。

    【讨论】:

      【解决方案3】:

      您的 .jar 中有 MANIFEST.MF 文件,放在 META-INF 文件夹中。

      如果不存在,您可以创建一个新的。

      http://docs.oracle.com/javase/tutorial/deployment/jar/defman.html

      示例内容:

      Manifest-Version: 1.0
      Created-By: 1.7.0_06 (Oracle Corporation)
      Main-Class: org.package.MainClass
      

      【讨论】:

      • 请注意,只有当您使用-jar 选项来运行您的 Java 程序(运行可执行 JAR)时,才会使用此选项。
      【解决方案4】:

      您收到此错误是因为类路径应包含由冒号 : 而不是空格分隔的条目。当 shell 扩展 target/* 时,它会在每个文件之间放置空格,这使得 java “认为”只有第一个 jar 文件在类路径中,第二个 jar 文件是您要运行的类的名称,并且rest 是应该传递给main 的命令行参数。

      如果引用路径,java 会将 * 扩展为具有正确分隔符的文件列表:

      java -cp "./staged/*" play.core.server.NettyServer ./..
      

      另见other ways to create a classpath from all the files in a directory in this question

      【讨论】:

      • @Mark,如果您的 java 命令版本没有在类路径中扩展 *,那么还有许多其他方法可以计算它。 (见编辑)
      【解决方案5】:

      shell 扩展你的命令行

      java -cp ./staged/* play.core.server.NettyServer ./..
      

      例如到

      java -cp ./staged/play_2.10-2.1-RC1.jar ./staged/akka-slf4j_2.10.0-RC1-2.1.0-RC1.jar  ...  play.core.server.NettyServer ./..
      

      Java 现在将./staged/play_2.10-2.1-RC1.jar 作为类路径,将./staged/akka-slf4j_2.10.0-RC1-2.1.0-RC1.jar 作为第一个参数,用于搜索主类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-30
        • 2010-10-21
        • 2015-01-16
        • 1970-01-01
        • 2010-10-14
        • 2018-07-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多