簡體   English   中英

如何檢測Java類路徑中缺少符號的用法

[英]Howto detect usage of missing symbol in Java classpath

我有時在Java中會遇到依賴地獄。 常見的問題是:庫A在版本2.5中依賴於庫C,而庫B也依賴於C,但是在版本2.6中。 然后,我必須解決一個問題:兩個版本的C庫是否向后兼容? 我可以在一個應用程序類路徑中使用庫A,B和C嗎? 還是應該使用舊版本的C創建A的“陰影包”?

如果兩個版本的C庫不兼容並且我使用它,則通常可以啟動應用程序。 但是,幾個小時或幾天之后,“沒有這種方法”會發生異常! 我想在應用程序啟動之前而不是在運行時中檢測到此問題。

問題是 :是否存在一些可以按類列出所有已使用符號以及按類列出所有提供的符號的工具? 然后,我可以創建腳本來檢測使用過但缺少的符號...

javap命令可以列出由類定義的所有符號。

javap -c命令顯示了類使用的外部方法和字段,作為反匯編后的字節碼中的注釋。 您可能可以取消選擇它們。

一位同事建議我遷移經理( https://www.lightbend.com/community/core-tools/migration-manager ),該文件顯示類路徑(一個庫的兩個版本)中的二進制不兼容。 這不是我想要的,但是很有幫助...

$java -jar migration-manager-cli-0.1.9.jar \
  --prev ~/.m2/repository/com/google/protobuf/protobuf-java/2.4.1/protobuf-java-2.4.1.jar  \
  --curr ~/.m2/repository/com/google/protobuf/protobuf-java/2.5.0/protobuf-java-2.5.0.jar \
  --direction both

Found 393 binary incompatibilities
==================================
 * abstract method getNameBytes()com.google.protobuf.ByteString in interface
   com.google.protobuf.DescriptorProtos#ServiceDescriptorProtoOrBuilder is
   present only in current version

...

這里正在解決類似的問題:

如何在JAR中靜態識別缺少的方法(二進制兼容性)

快速谷歌搜索顯示可能的解決方案在這里:

http://vongosling.github.io/dependency-mediator/

(但是我沒有使用該工具的經驗)

暫無
暫無

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

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