2017-08-04 155 views
0

我是java的新手,在执行Class/Jar文件时遇到同样的老问题,即出现错误提示“无法找到或加载主类com。 finance.LoanProcessor“,其中com.finance.LoanProcessor是我的全限定类名。我创建了许多其他示例项目,我可以在其中执行两个类/ jar文件。只有这个项目造成了这个问题。使用Java Class和Jar文件找不到或加载主类

以下是我从Java教程和StackOverflow的解决方案,了解此问题:

  1. 在执行直接使用的Java“的命令,我需要用这个语法类文件:JAVA com.finance.LoanProcessor

注意:我不应该使用'.class'后缀。在命令提示符下,我应该在具有'com'文件夹的父文件夹中,以便java命令可以在com/finance目录内导航并执行LoanProcessor类。

  • 当执行直接使用的Java“命令的jar文件,我需要使用以下语法:Java的罐子LoanOnboardingSystem-1.0-SNAPSHOT.jar
  • 注:我应该在这个jar文件所在的同一个目录中。另外,该jar应该有META-INF/MANIFEST.MF文件,该文件应该具有定义的Main-Class:com.finance.LoanProcessor属性。

    我已经记住了上述所有注意事项,并尝试执行我的主类和jar,但两者都失败。虽然其他示例项目在同一台笔记本电脑上以相同方式执行,但只有该项目出错。我已经在我的办公室问了一些java专家,但他们也无法解决问题。

    因此,我已上载于以下现在git仓库整个项目:LoanOnboardingProject

    难道社会好心帮检查项目,并建议我缺少的是什么?我曾问过

    一些其他的东西:

    1. 我使用的IntelliJ IDE。我用IDE的开箱即用选项构建了jar,并且它提供了相同的错误。 [此jar位于上述资源库中'out'文件夹下。]

    2. 我已将上述项目创建为Maven项目。我使用'mvn package'命令来构建jar,但它给出了相同的错误。 [这个jar文件位于上面的repository中'target'文件夹下。]

    3. 当我在IntelliJ本身内运行程序时,它工作得很好。没有问题。

    非常感谢。任何帮助深表感谢。

    +0

    让行家做包装和adminsiter你的依赖。你需要学习maven以及Java –

    +0

    @StimpsonCat:谢谢你的回应。我已经使用maven quickstart模板来创建项目,并且我也使用'mvn package'命令构建了jar文件(正如后面提到的那样)。尽管如此,同一个jar文件也给出了相同的错误。 –

    +0

    此外,一旦执行至少可以找到主类并执行相同的操作,那么关于依赖关系的错误就会出现。我注意到在其他项目中。然而,就我而言,'java'exe无法找到主类com.finance.LoanProcessor。 –

    回答

    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 
    
    +0

    注册了详细解释 –

    +0

    感谢您的详细解释。这对我有用,我能够得到它的所有依赖的jar。标记为答案。 –

    +0

    但是,同样有一个改进:当我运行着色的jar时,我得到了这个链接中提到的sprint-boot框架错误:https://stackoverflow.com/questions/38792031/springboot-making-jar-files -no-自动配置类发现的功能于META-INF。因此,我遵循上面提到的答案中的一个来使用'spring-boot-maven-plugin',它也像魅力一样工作。即使我没有使用阴影插件,只是使用'spring-boot-maven-plugin',现在它创建的jar很好,我可以从命令提示符执行相同的操作。 –

    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 
    
    +0

    你好Anuj,谢谢你的回应。我尝试过,但由它创建的jar会抛出错误,因为没有找到主类。为了解决这个问题,我需要按照Jan的建议在上面的回答中添加 XML节点。然而,那么你和Jan的答案是相似的,并且两者的行为方式都是相同的。 –

    +0

    您如何执行代码。我能够使用我提供的命令执行jar: –

    +0

    啊..我的坏..我使用命令'java -jar LoanOnboardingSystem-1.0-SNAPSHOT.jar'而不是你提供的。当我使用命令时,类被执行(在我发布在这篇文章中的答案中提到了spring-boot错误)。对不起,我感到困惑,谢谢你的回答。我现在无法将两个帖子标记为“答案”,因此一旦我获得了足够的信誉积分,我就可以大声提出您的答案。 :) –

    0

    上面Jan提供的答案肯定会解决很多人的问题,也解决了我的问题。但是,因为我使用的是spring引导,所以在运行着色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。

    万一该链接有一天出现故障,我在这里张贴了同样的答案太:

    <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>