簡體   English   中英

必須啟動InstrumentationLoadTimeWeaver / openjdk 11

[英]Must start InstrumentationLoadTimeWeaver / openjdk 11

我們有一個生產Java 1.6 / Tomcat 7 / Spring 4的應用程序。

我們將其移至Openjdk11。這意味着Spring 5和我認為它可能還包括Tomcat 9,因為我們正在更新其他所有內容。

問題是自我解釋的聲音:

錯誤org.springframework.web.context.ContextLoader-上下文初始化失敗org.springframework.beans.factory.UnsatisfiedDependencyException:創建名稱為'rootContextConfig'的bean時出錯:未通過字段'entityManagerFactory'表示的依賴關系; 嵌套的異常是org.springframework.beans.factory.BeanCreationException:創建在com.xxxxx.config.RootContextConfig中定義的名稱為'entityManagerFactory'的bean時出錯:調用init方法失敗; 嵌套異常為java.lang.IllegalStateException: 必須以Java代理開頭才能使用InstrumentationLoadTimeWeaver。 參見Spring文檔。

一切都很好。 唯一的問題是我們已經有了Spring Insturment Java代理

-javaagent:${CATALINA_HOME}/lib/spring-instrument-5.1.5.RELEASE.jar

就像我上面說的那樣,這是所有工作代碼,我們只是在更新版本。

我有信心正在加載LTW,因為我們可以看到InstrumentationLoadTimeWeaver類產生的錯誤。

@Override
public void addTransformer(ClassFileTransformer transformer) {
    Assert.notNull(transformer, "Transformer must not be null");
    FilteringClassFileTransformer actualTransformer =
            new FilteringClassFileTransformer(transformer, this.classLoader);
    synchronized (this.transformers) {
        Assert.state(this.instrumentation != null,
                "Must start with Java agent to use InstrumentationLoadTimeWeaver. See Spring documentation.");
        this.instrumentation.addTransformer(actualTransformer);
        this.transformers.add(actualTransformer);
    }
}

我只是想不通如何使用null工具實例化它。 顯然我缺少了一些東西。 可能是一些小而愚蠢的東西。 但是現在我沒主意了。

看來問題在於類加載

  1. 添加'-verbose:class'選項以查看是否加載了InstrumentationLoadTimeWeaver

  2. 嘗試將此選項添加到您的tomcat contexct配置<Context> ... <Loader delegate="true"/> ... </Context>

Tomcat 7.0.27中有一些更改可以觸發此問題

使Catalina.getParentClassLoader的實現與整個代碼庫中的類似方法保持一致,如果未設置父類加載器,則使它返回系統類加載器。 (Markt的)

暫無
暫無

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

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