#java #maven #groovy #osgi #pax-exam
#java #maven #groovy #osgi #pax-экзамен
Вопрос:
Я поддерживаю библиотеку с открытым исходным кодом, частично основанную на Groovy, которая называется Rest Assured. В следующей версии я хотел бы обновить зависимость Groovy с 2.4.x до 2.5.x. Однако при выполнении этого я сталкиваюсь с проблемами при запуске тестов OSGi. Тесты используют Pax Exam, обычно они выглядят примерно так:
@RunWith(PaxExam.class)
public class XmlPathOSGiITest {
@Configuration
public static Option[] configure() {
return new Option[]
{
mavenBundle("org.apache.servicemix.bundles", "org.apache.servicemix.bundles.hamcrest", "1.3_1"),
junitBundles(),
systemProperty("pax.exam.osgi.unresolved.fail").value("true"),
systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value("INFO"),
/* Transitive dependencies needed in the Pax Exam container.
Some of these need to be wrapped because they are not available as OSGi bundles */
mavenBundle("org.apache.commons", "commons-lang3").versionAsInProject(),
wrappedBundle(mavenBundle().groupId("org.ccil.cowan.tagsoup").artifactId("tagsoup").versionAsInProject()),
wrappedBundle(mavenBundle("javax.xml.bind", "jaxb-api").versionAsInProject()),
wrappedBundle(mavenBundle("javax.activation", "activation").version("1.1.1")),
wrappedBundle(mavenBundle().groupId("org.codehaus.groovy").artifactId("groovy-all").version("2.5.6")),
wrappedBundle(mavenBundle("org.apache.httpcomponents", "httpclient").versionAsInProject()),
wrappedBundle(mavenBundle("org.apache.httpcomponents", "httpmime").versionAsInProject()),
wrappedBundle(mavenBundle("org.apache.httpcomponents", "httpcore").versionAsInProject()),
/* Rest Assured dependencies needed in the Pax Exam container to be able to execute the tests below */
mavenBundle("io.rest-assured", "json-path").versionAsInProject(),
mavenBundle("io.rest-assured", "xml-path").versionAsInProject(),
mavenBundle("io.rest-assured", "rest-assured").versionAsInProject(),
mavenBundle("io.rest-assured", "rest-assured-common").versionAsInProject()
};
}
@Test
public void getUUIDParsesAStringResultToUUID() {
final String UUID_XML = "<some>n"
" <thing id="1">db24eeeb-7fe5-41d3-8f06-986b793ecc91</thing>n"
" <thing id="2">d69ded28-d75c-460f-9cbe-1412c60ed4cc</thing>n"
"</some>";
final UUID uuid = from(UUID_XML).getUUID("some.thing[0]");
assertThat(uuid, Matchers.equalTo(UUID.fromString("db24eeeb-7fe5-41d3-8f06-986b793ecc91")));
}
}
Запуск этого теста вызовет ошибку:
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 1.86 sec <<< FAILURE! - in io.restassured.test.osgi.XmlPathOSGiITest
getUUIDParsesAStringResultToUUID(io.restassured.test.osgi.XmlPathOSGiITest) Time elapsed: 1.85 sec <<< ERROR!
java.io.IOException: Error resolving artifact org.codehaus.groovy:groovy-all:jar:2.5.6: Could not find artifact org.codehaus.groovy:groovy-all:jar:2.5.6 in central (http://repo1.maven.org/maven2/)
at org.ops4j.pax.url.mvn.internal.AetherBasedResolver.resolve(AetherBasedResolver.java:626)
Предметом интереса, вероятно, является эта строка:
wrappedBundle(mavenBundle().groupId("org.codehaus.groovy").artifactId("groovy-all").version("2.5.6")),
Все работало нормально, когда Groovy был указан для использования version
2.4.15. Итак, мои вопросы:
Как мне обновить Groovy с 2.4 до 2.5 в контексте OSGi, если в прошлом я зависел от groovy-all
jar версии 2.4? И как мне отразить это в тесте?
Ответ №1:
Оказывается, что после выбора правильных артефактов, в данном случае groovy и groovy-json, вам также понадобится Apache Aries SPI Fy.
mavenBundle().groupId("org.apache.aries.spifly").artifactId("org.apache.aries.spifly.dynamic.bundle").version("1.2.1")
Если вы не добавите этот пакет, пакет фрагментов groovy-json OSGi не будет разрешен без каких-либо намеков на причину в протоколировании.
Ответ №2:
Я думаю, что начиная с версии 2.5 нет ни одного jar https://issues.apache.org/jira/browse/GROOVY-8751
Ответ №3:
Похоже, проблема с извлечением Groovy 2.5.6 из центра. Я получаю ту же ошибку, пытаясь напрямую использовать Maven: mvn org.apache.maven.plugins:maven-dependency-plugin:3.1.1:get org.codehaus.groovy:groovy-all:jar:2.5.6
Глядя на сервер, вы можете видеть, что доступны только документы и исходные тексты, но не файл JAR. Это относится ко всем версиям Groovy-all версии 2.5.
Я предполагаю, что причина этого в том, что все версии 2.5 являются просто своего рода «мета-артефактом» без собственного кода (поэтому JAR недоступен). Фактическая реализация разбита на следующие артефакты groovy-все зависит от:
org.codehaus.groovy:groovy
org.codehaus.groovy:groovy-ant
org.codehaus.groovy:groovy-cli-commons
org.codehaus.groovy:groovy-cli-picocli
org.codehaus.groovy:groovy-console
org.codehaus.groovy:groovy-datetime
org.codehaus.groovy:groovy-docgenerator
org.codehaus.groovy:groovy-groovydoc
org.codehaus.groovy:groovy-groovysh
org.codehaus.groovy:groovy-jmx
org.codehaus.groovy:groovy-json
org.codehaus.groovy:groovy-jsr223
org.codehaus.groovy:groovy-macro
org.codehaus.groovy:groovy-nio
org.codehaus.groovy:groovy-servlet
org.codehaus.groovy:groovy-sql
org.codehaus.groovy:groovy-swing
org.codehaus.groovy:groovy-templates
org.codehaus.groovy:groovy-test
org.codehaus.groovy:groovy-test-junit5
org.codehaus.groovy:groovy-testng
org.codehaus.groovy:groovy-xml
Поэтому для изменения вашего кода вы должны определить артефакты groovy, которые вам действительно нужны, и добавить их один за другим в свой код.