Проверьте зависимости в сборке Maven - PullRequest
3 голосов
/ 13 октября 2011

Есть ли способ написать тест, который проверяет зависимости Maven?

В нашем проекте мы обнаружили следующие проблемы:

  • Некоторые части проекта используют commons-io:commons-io, другие использовали org.apache.commons:commons-io

  • Использовалась неправильная версия зависимости

  • stax использует версии 1.0-2 и1.0.1.Используя автоматическое разрешение зависимостей, 1.0-2 выигрывает.

Итак, я хочу написать контрольный пример, который принимает текущее дерево зависимостей в качестве входных данных и запускает несколько проверок.Это возможно?

Ответы [ 2 ]

1 голос
/ 13 октября 2011
@Test
public void testCommonsIo() throws Exception {
    assertDependencyVersion("commons-io", "commons-io", "2.0");
}

private void assertDependencyVersion(final String groupId, 
        final String artifactId, final String expectedVersion) 
        throws IOException {

    final StringBuilder sb = new StringBuilder("/META-INF/maven/");
    sb.append(groupId).append("/").append(artifactId);
    sb.append("/pom.properties");
    final String resourcePath = sb.toString();

    final InputStream propertiesStream = this.getClass()
        .getResourceAsStream(resourcePath);
    assertNotNull("no dependency found: " + groupId + ":" + artifactId, 
        propertiesStream);

    final Properties properties = new Properties();
    properties.load(propertiesStream);

    assertEquals("group", groupId, properties.getProperty("groupId"));
    assertEquals("artifact", artifactId, properties.getProperty("artifactId"));
    assertEquals("version", expectedVersion, properties.getProperty("version"));
}

Проверьте этот ответ тоже.


Вот метод подтверждения для StAX и других зависимостей, которые не содержат pom.properties просто manifest.mf.Возможно, стоило бы кэшировать экземпляры Properties, если есть много вызовов assertDependencyByMetaInf.

@Test
public void testStaxDependency() throws Exception {
    assertDependencyByMetaInf("StAX", "1.0.1");
}

private void assertDependencyByMetaInf(final String specTitle, 
        final String expectedSpecVersion) throws IOException {
    final ClassLoader cl = this.getClass().getClassLoader();

    final String resourcePath = "META-INF/MANIFEST.MF";
    final Enumeration<URL> resources = cl.getResources(resourcePath);

    boolean found = false;
    while (resources.hasMoreElements()) {
        final URL url = resources.nextElement();
        final InputStream metaInfStream = url.openStream();

        final Properties metaInf = new Properties();
        metaInf.load(metaInfStream);

        final String metaInfSpecTitle = 
            metaInf.getProperty("Specification-Title");
        if (!specTitle.equals(metaInfSpecTitle)) {
            continue;
        }

        final String specVersion = 
            metaInf.getProperty("Specification-Version");
        assertEquals("version mismatch for " + specTitle, 
            expectedSpecVersion, specVersion);
        found = true;
    }
    assertTrue("missing dependency: " + specTitle, found);
}
0 голосов
/ 14 октября 2011

Следуя совету palacsint, вот другой подход: посчитайте, как часто класс находится на пути к классам, и напечатайте URL-адреса, если их больше одного.

private void assertOnceOnClassPath( String resourcePath ) throws IOException {
    ClassLoader cl = getClass().getClassLoader();

    Enumeration<URL> resources = cl.getResources( resourcePath );
    List<URL> urls = new ArrayList<URL>();
    while( resources.hasMoreElements() ) {
        URL url = resources.nextElement();
        urls.add( url );
    }

    if( urls.size() != 1 ) {
        fail( "Expected exactly 1 item:\n" + StringUtils.join( urls, "\n" ) );
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...