无法使用Java Class和Jar文件查找或加载主类

时间:2017-08-04 09:21:36

标签: java maven jar

我是java的新手,在执行Class / Jar文件时面临同样的老问题,即收到错误,说明"无法找到或加载主类com.finance.LoanProcessor",其中com.finance .LoanProcessor是我的完全限定类名。我已经创建了许多其他示例项目,我可以在其中执行这两个类/ jar文件。只有这个项目才会导致这个问题。

以下是我从Java教程和StackOverflow解决方案中了解到的这个问题:

  1. 使用' Java'直接执行类文件命令,我需要使用以下语法:java com.finance.LoanProcessor
  2. 注意:我不应该使用' .class'后缀。在命令提示符下,我应该在父文件夹中,其中包含' com'文件夹,以便java命令可以在com / finance目录中导航并执行LoanProcessor类。

    1. 使用' Java'直接执行jar文件命令,我需要使用以下语法:java -jar LoanOnboardingSystem-1.0-SNAPSHOT.jar
    2. 注意:我应该位于此jar文件所在的同一目录中。此外,jar应该有META-INF / MANIFEST.MF文件,该文件应该定义Main-Class:com.finance.LoanProcessor属性。

      我记住了所有上面的注意事项,并尝试执行我的主要课程和罐子两者,但两者都失败了。虽然其他示例项目在我的同一台笔记本电脑上以相同的方式执行,但只有这个项目出错。我在办公室里问过一些java专家,但是他们也找不到问题。

      因此,我现在已经将整个项目上传到关注git存储库:LoanOnboardingProject

      社区能否帮助检查项目并提出我缺少的建议?

      我做的其他事情很少:

      1. 我正在使用IntelliJ IDE。我用IDE创建了带有开箱即用选项的jar,它也给出了同样的错误。 [这个罐子在' out'上面的存储库中的文件夹。]

      2. 我已经将上面的项目创建为Maven项目。我使用了&mvn package'用于构建jar的命令,但它给出了相同的错误。 [这个罐子属于'目标'上面的存储库中的文件夹。]

      3. 当我在IntelliJ中运行程序时,它运行正常。没问题。

      4. 提前多多感谢。非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

问题是,你的主类LoanProcessor实现了CommandLineRunner接口。此类不包含在生成的jar中(由maven构建时)。因此它不在类路径上。这就是为什么java无法加载主类的原因(因为它引用了另一个无法找到的类)。

要运行应用程序,您需要将所有必需的类添加到类路径中(使用java命令的-cp参数)。在您的情况下,这将非常复杂,因为您需要添加pom.xml文件中指定的所有依赖项。以及这些依赖所需的所有罐子。那可能是很多jar文件。

你可以使用maven-shade-plugin构建一个包含所有依赖项的jar。

这是一个示例配置(将pom添加到该部分):

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-shade-plugin</artifactId>
  <version>2.3</version>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>shade</goal>
      </goals>
      <configuration>
        <transformers>
          <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
            <manifestEntries>
              <Main-Class>com.finance.LoanProcessor</Main-Class>
            </manifestEntries>
          </transformer>
          <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
        </transformers>
      </configuration>
    </execution>
  </executions>
</plugin>

然后您将能够执行该类(当站在包含pom.xml的目录中时):

java -cp target/LoanOnboardingSystem-1.0-SNAPSHOT.jar com.finance.LoanProcessor

或通过:

java -jar target/LoanOnboardingSystem-1.0-SNAPSHOT.jar 

答案 1 :(得分:1)

In you pom.xml replace build with given below. Using maven-shade-plugins.

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.3</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <keepDependenciesWithProvidedScope>false</keepDependenciesWithProvidedScope>
                            <promoteTransitiveDependencies>false</promoteTransitiveDependencies>
                            <createDependencyReducedPom>false</createDependencyReducedPom>
                            <minimizeJar>false</minimizeJar>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>



To Execute:

java -cp LoanOnboardingSystem-1.0-SNAPSHOT.jar com.finance.LoanProcessor

答案 2 :(得分:0)

上面提到的答案肯定会解决很多人的问题,它也解决了我的问题。但是,由于我使用的是弹簧启动,因此在运行着色jar时出现了另一个错误:“在META-INF / spring.factories中找不到自动配置类”。

因此,我在StackOverflow本身遇到this链接,解决了上述问题。

有趣的是,现在我只在pom.xml中使用'spring-boot-maven-plugin',而不是'maven-shade-plugin',那么项目jar也会被执行得很好。 Spring-boot-maven-plugin还包含jar文件中所有必需的依赖项,并创建一个比'maven-shade-plugin'创建的jar小的jar。

如果有一天链接出现故障,我也会在这里发布相同的答案:

   <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>1.5.2.RELEASE</version>
      <executions>
       <execution>
        <goals>
         <goal>repackage</goal>
        </goals>
       </execution>
     </executions>
   </plugin>