2017-08-04 154 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>