【发布时间】: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。但是当我再次尝试这个时,它找不到主类。 谢谢
编辑: 我改用了 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