【问题标题】:Running Java program/Jar from command line从命令行运行 Java 程序/Jar
【发布时间】:2021-04-08 01:40:13
【问题描述】:

我有一个使用 maven 在 intellij 中编写的 java 程序。我将它导出为 jar 并尝试从命令行运行,但它一直在告诉我

错误:无法找到或加载主类 com.company.Main 引起:java.lang.ClassNotFoundException: com.company.Main

然后我尝试从命令行运行程序本身,这也告诉我它找不到主类

命令行: 对于 jar:java -jar selenium_project.jar

用于运行程序:java com.company.Main

对于 jar,我从它所在的文件夹运行它。对于程序,我从程序的根目录运行它。

Pom.xml

<build>
<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.4</version>
        <configuration>
            <archive>
                <index>true</index>
                <manifest>
                    <mainClass>com.company.Main</mainClass>
                </manifest>
            </archive>
        </configuration>
    </plugin>
</plugins></build>

清单:

Manifest-Version: 1.0
Main-Class: com.company.Main

这可能是maven的问题,我不知道。我创建了一个简单的 hello world 程序并从命令行运行它并且它工作。我像这样运行它 (c://etc)../src/> java com.company.HelloWorld。但是当我再次尝试这个时,它找不到主类。 谢谢

These are my classes

编辑: 我改用了 maven-assembly-plugin 并重建了 jar 仍然无法工作

<build>

<plugins>

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>single</goal>
                </goals>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>
                                com.company.Main
                            </mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </execution>
        </executions>
    </plugin>

</plugins></build>

class structure to show where main class is

Main 类中的代码

public class Main {

public static void main(String[] args) throws IOException, SQLException {
    System.out.println("hello");

    Executor ex = new Executor();

}

}

【问题讨论】:

  • 你确定你导出的jar里面有Main.class文件吗?尝试运行 jar tvf selenium_project.jar 。其中一项必须是 com/company/Main.class 。你看到了吗?
  • 我得到了大量的列表,以至于我什至看不到它的顶部。该命令有什么作用?这是我能看到的最重要的一行,237 Mon Dec 21 15:31:02 EST 2020 org/bouncycastle/jcajce/provider/asymmetric/ec/SignatureSpi$1.class
  • 您可能使用了错误的 jar。如果我没记错的话,Selenium 是一个测试框架。你确定要调用那个罐子吗?您可以像这样过滤列表:jar tvf selenium_project.jar | grep Main.class
  • 我明白了 - 'grep' 不被识别为内部或外部命令、可运行程序或批处理文件.....我创建了 jar,它是一个测试框架,但我构建了一个简单的网络刮刀,这就是我变成罐子的东西
  • 抱歉,假设您使用的是 Linux。您很可能在 jar 中没有名为 com.company.Main 的类。该类甚至存在于您的源代码树中吗?通俗地说,java 命令的目标是在给定的类上执行静态 main 方法。在这里,您将类指定为 com.company.Main。所以java首先需要找到那个类文件,然后调用main方法。使用该信息尝试确定类文件是否存在,以及它是否具有 main 方法。

标签: java maven command-line jar executable-jar


【解决方案1】:

您的错误可能是您的 Main 类在错误的包中。

此外,如果您有依赖项,请不要使用 Maven shade 插件或 Maven 程序集插件来构建可执行 jar。

【讨论】:

  • 已在上面编辑 - 我尝试了 maven 程序集插件,但没有成功
  • 您还需要检查 Main 类。我仍然怀疑它是否在正确的包装中。这个包真的叫com.company吗?您还可以解压 JAR 并检查 Main 类所在的目录。
  • 我添加了上面的类结构和我的“Main”类中的代码
【解决方案2】:

我不知道问题是什么。我尝试创建一个新程序,并复制了类并重新制作了 pom.xml 文件,我的新程序除了一个依赖项(chrome 选项)之外可以工作,但我认为这不是导致问题的原因。所以现在我只需要弄清楚为什么 Chrome 选项不起作用,但新程序中的实际 jar 确实运行。

【讨论】:

    【解决方案3】:

    来自:https://www.xspdf.com/resolution/54971948.html 要从 jar 文件中提取文件,请使用 x ,如:C:\Java> jar xf myFile.jar。要从 jar 文件中仅提取某些文件,请提供其安装存档程序。 JAR 文件就像 ZIP 文件一样工作。您可以使用任何存档程序来提取它们。 2. 找到要解压的 JAR 文件。使用文件资源管理器(按 Win + E 打开文件资源管理器)或 Mac 上的 Finder 到 3. 右键单击​​ JAR 文件。这样做 。如何从 jar 中提取清单文件。提取 JAR 文件的内容。

    【讨论】:

      猜你喜欢
      • 2012-04-10
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 2012-11-19
      • 2013-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多