2016-11-30 7 views
1

私は、リリース20で廃止されたGuavaの廃止予定機能に依存する古いCassandraドライバライブラリを使用するプロジェクトを持っています。私がGuavaのバージョンを誤って19から20に増やしたGuavaのバージョンを検出しますか?

使用するGuavaのバージョンをプログラムで確認するにはどうすればよいですか?

答えて

1

私はバージョンへのアクセスを取得するための簡単な方法を見つけるが、ここで私の作品解決策ではありませんでした。

@Test(expected = ClassNotFoundException.class) 
public void mustNotUpgradeToGuava20_asItIsIncompatibleWithCassandra() throws ClassNotFoundException { 
    Class.forName("com.google.common.graph.Graph"); 
} 

このテストでは、グアバ19まで通過して、グァバ20で失敗します。 Graphクラスは、リリースノートに追加されたクラスの最初のヒットにすぎません。

4

guava.jarのMETA-INF /の下にあるファイルからバージョン文字列を取得できます。実行時に、適切なClassLoaderインスタンスを使用して、必要なMETA-INF /ファイルをロードする必要があります。 GuavaのResourcesユーティリティクラスを使用して、一意の名前のリソースを直接ロードするか、複数のjarファイルの同じ名前のリソースを反復処理することができます($someGuavaClassName.class.getClassLoader().getResources(String)を使用)。後者の場合は、テスト対象のバージョンに存在するsomeGuavaClassNameを使用する必要があります。 Resourcesは1.0以降、Guavaに入っています。いつでもどこでも行くとは思わないので、安全なクラスにする必要があります。

私はGuava 20.0と12.0で以下のテストを行いました。両方とも動作しました。

public class GuavaVersionFetcher { 
    public static void main(String... args) throws IOException { 
     System.out.println(determineGuavaMavenVersion()); 
     System.out.println(determineGuavaManifestVersion()); 
    } 

    public static String determineGuavaMavenVersion() throws IOException { 
     String resourceName = "META-INF/maven/com.google.guava/guava/pom.properties"; 
     Properties properties = new Properties(); 
     try (InputStream inputStream = Resources.getResource(resourceName).openStream()) { 
      properties.load(inputStream); 
     } 
     return properties.getProperty("version"); 
    } 

    public static String determineGuavaManifestVersion() throws IOException { 
     Enumeration<URL> resources = Resources.class.getClassLoader() 
       .getResources("META-INF/MANIFEST.MF"); 
     while (resources.hasMoreElements()) { 
      Manifest manifest; 
      try (InputStream inputStream = resources.nextElement().openStream()) { 
       manifest = new Manifest(inputStream); 
      } 
      Attributes mainAttributes = manifest.getMainAttributes(); 
      String symbolicName = mainAttributes.getValue("Bundle-SymbolicName"); 
      if ("com.google.guava".equals(symbolicName)) { 
       return mainAttributes.getValue("Bundle-Version"); 
      } 
     } 
     return null; 
    } 
} 

出力例:

20.0 
20.0.0 

注:グアバチームが今まで離れてMavenを使用してから移動した場合第1の方法はもはやそれほど動かない可能性があり、私はそれがグアバのすべての比較的最近のバージョンで動作します疑いますマニフェストメソッドを使うことをお勧めします。

関連する問題