簡體   English   中英

使用庫運行AWS lambda函數時的NoClassDefFoundError

[英]NoClassDefFoundError when running AWS lambda function with libraries

我們正在開發一個項目,使用由API網關請求觸發的lambda函數來處理文件。 該函數然后獲取S3存儲桶中的文件並開始讀取它。 在此之前,一切都按預期工作,但是當文件讀取開始時,我們收到以下錯誤:

(...)
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.101-3.b13.24.amzn1.x86_64/jre/lib/rt.jar: error reading zip file
2017-02-06 19:15:06 <9025af71-eca0-11e6-82d2-9ff4b9184005> ERROR JRestlessHandlerContainer:339 - container failure
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.101-3.b13.24.amzn1.x86_64/jre/lib/rt.jar: error reading zip file
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.101-3.b13.24.amzn1.x86_64/jre/lib/rt.jar: error reading zip file
END RequestId: (some id)
REPORT RequestId: (some id)  Duration: 3047.44 ms    Billed Duration: 3100 ms        Memory Size: 1536 MB    Max Memory Used: 94 MB  

Exception in thread "main" java.lang.Error: java.lang.NoClassDefFoundError: java/lang/Throwable$WrappedPrintWriter
    at lambdainternal.AWSLambda.<clinit>(AWSLambda.java:59)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at lambdainternal.LambdaRTEntry.main(LambdaRTEntry.java:94)
Caused by: java.lang.NoClassDefFoundError:     java/lang/Throwable$WrappedPrintWriter
    at java.lang.Throwable.printStackTrace(Throwable.java:721)
    at lambdainternal.UserFault.trace(UserFault.java:43)
    at lambdainternal.UserFault.makeUserFault(UserFault.java:26)
    at lambdainternal.AWSLambda.startRuntime(AWSLambda.java:290)
    at lambdainternal.AWSLambda.<clinit>(AWSLambda.java:57)
    ... 3 more
START RequestId: (some id) Version: $LATEST
END RequestId: (some id)

我們使用自己的自定義文件讀取/處理庫(Java項目),因為文件也是根據我們的需求定制的,我們使用Maven將它添加到我們的項目中。 我們的lambda jar是使用Maven Shade插件生成的:

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

在本地測試項目,它工作正常,我們可以獲取文件信息。 我們的代碼使用JAX-RS和Spring來處理API網關(我們不確定這是否會干擾結果)。 但是,到目前為止,在使用lambda運行項目時,我們無法解決此問題。 在我們的測試期間,我們故意增加了函數超時和內存,但無論限制是什么,錯誤都會持續存在。

先感謝您。

使用日志技術,對我們的代碼進行調試並聯系AWS支持,我們看到我們的一個庫在禁止目錄中創建文件,如下所述: https//aws.amazon.com/lambda/faqs/ ,以及Lambda函數失敗了。

他們解釋說如果你需要創建文件,你必須使用/ tmp目錄,在我們遇到這個問題之前我們沒有注意到這一點。 我們一遍又一遍地閱讀文檔,但是這一件事仍然抓住了我們,它發生了,我想。 無論如何,在庫中更改后,函數現在可以按預期完美地執行。

謝謝大家的幫助。

你還有問題嗎? 可能是Lambda服務正在您正在使用的特定區域中維護。 此錯誤告訴我JRE已損壞,無法訪問rt.jar提供的庫。 如有必要,請聯系支持。 您可以在此處查看AWS運行狀況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM