Maven - конфликт зависимостей со Spark и HtmlUnit
Я хотел бы использовать веб-фреймворк "spark" (клон sinatra в Java) в сочетании с HtmlUnit.
Идея состоит в том, что мой WebService сможет загружать веб-сайты и анализировать их (и выполнять JavaScripts и т. Д.), А затем собирать некоторые данные, делать некоторую статистику и т. Д. HtmlUnit предназначен не только для тестирования, но и фактически необходим в основном проекте.
В любом случае Spark работает на Jetty, и Spark и HtmlUnit, похоже, используют одну и ту же клиентскую библиотеку websocket (org.eclipse.jetty.websocket:websocket-client:9.3.2.v20150730
), но с разными версиями. Также есть несколько других библиотек, которые создают проблемы.
Проекты компилируются нормально, но не запускается веб-сервер.
Есть ли способ как-то разрешить эти конфликты?
Вот мои зависимости:
<dependencies>
<dependency>
<groupId>com.sparkjava</groupId>
<artifactId>spark-core</artifactId>
<version>2.3</version>
</dependency>
<dependency>
<groupId>com.sparkjava</groupId>
<artifactId>spark-template-freemarker</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
<version>2.19</version>
</dependency>
</dependencies>
Я также нашел плагин принудительного применения, который перечисляет все конфликты. Вот вывод:
Failed while enforcing releasability the error(s) are [
Dependency convergence error for org.slf4j:slf4j-api:1.7.12 paths to dependency are:
+-com.example:helloworld:1.0-SNAPSHOT
+-com.sparkjava:spark-core:2.3
+-org.slf4j:slf4j-api:1.7.12
and
+-com.example:helloworld:1.0-SNAPSHOT
+-com.sparkjava:spark-core:2.3
+-org.slf4j:slf4j-simple:1.7.12
+-org.slf4j:slf4j-api:1.7.12
and
+-com.example:helloworld:1.0-SNAPSHOT
+-com.sparkjava:spark-template-freemarker:2.0.0
+-org.slf4j:slf4j-api:1.7.2
,
Dependency convergence error for commons-codec:commons-codec:1.9 paths to dependency are:
+-com.example:helloworld:1.0-SNAPSHOT
+-net.sourceforge.htmlunit:htmlunit:2.19
+-org.apache.httpcomponents:httpclient:4.5.1
+-commons-codec:commons-codec:1.9
and
+-com.example:helloworld:1.0-SNAPSHOT
+-net.sourceforge.htmlunit:htmlunit:2.19
+-commons-codec:commons-codec:1.10
,
Dependency convergence error for xml-apis:xml-apis:1.3.04 paths to dependency are:
+-com.example:helloworld:1.0-SNAPSHOT
+-net.sourceforge.htmlunit:htmlunit:2.19
+-xalan:xalan:2.7.2
+-xalan:serializer:2.7.2
+-xml-apis:xml-apis:1.3.04
and
+-com.example:helloworld:1.0-SNAPSHOT
+-net.sourceforge.htmlunit:htmlunit:2.19
+-xerces:xercesImpl:2.11.0
+-xml-apis:xml-apis:1.4.01
,
Dependency convergence error for org.eclipse.jetty.websocket:websocket-client:9.3.2.v20150730 paths to dependency are:
+-com.example:helloworld:1.0-SNAPSHOT
+-com.sparkjava:spark-core:2.3
+-org.eclipse.jetty.websocket:websocket-server:9.3.2.v20150730
+-org.eclipse.jetty.websocket:websocket-client:9.3.2.v20150730
and
+-com.example:helloworld:1.0-SNAPSHOT
+-net.sourceforge.htmlunit:htmlunit:2.19
+-org.eclipse.jetty.websocket:websocket-client:9.2.13.v20150730
,
Dependency convergence error for com.sparkjava:spark-core:2.3 paths to dependency are:
+-com.example:helloworld:1.0-SNAPSHOT
+-com.sparkjava:spark-core:2.3
and
+-com.example:helloworld:1.0-SNAPSHOT
+-com.sparkjava:spark-template-freemarker:2.0.0
+-com.sparkjava:spark-core:2.0.0
]
2 ответа
Исключите зависимости, которые создали конфликт во всех местах, кроме одного, подобного этому:
<dependency>
<groupId>com.sparkjava</groupId>
<artifactId>spark-core</artifactId>
<version>2.3</version>
<exclusions>
<exclusion>
<artifactId>slf4j-simple</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
Добавляйте другие исключения везде, где это необходимо
РЕДАКТИРОВАТЬ: я создал тестовое приложение с зависимостями, которые вы перечислили, и я думаю, что это может работать
<dependencies>
<dependency>
<groupId>com.sparkjava</groupId>
<artifactId>spark-core</artifactId>
<version>2.3</version>
<exclusions>
<exclusion>
<artifactId>slf4j-simple</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
<exclusion>
<artifactId>websocket-server</artifactId>
<groupId>org.eclipse.jetty.websocket</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.sparkjava</groupId>
<artifactId>spark-template-freemarker</artifactId>
<version>2.0.0</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
<exclusion>
<artifactId>spark-core</artifactId>
<groupId>com.sparkjava</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
<version>2.19</version>
<exclusions>
<exclusion>
<artifactId>httpclient</artifactId>
<groupId>org.apache.httpcomponents</groupId>
</exclusion>
<exclusion>
<artifactId>xalan</artifactId>
<groupId>xalan</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
Второе, что вы можете использовать, это <dependencyManagement>
в корне ПОМ (того же уровня, что и <dependencies>
Вы использовали до сих пор). В зависимости от управления вы указываете, какая версия какой библиотеки будет использоваться, например:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>foo</groupId>
<artifactId>bar</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
</dependencyManagement>
Таким образом, независимо от того, какая версия библиотеки foo:bar
включена в любую из зависимостей, всегда будет использоваться версия 1.2.3.
У меня была точно такая же проблема, и я смог ее решить, установив все общие зависимости для htmlunit и sparkjava в одну и ту же версию следующим образом:
Обратите внимание, что я использую последнюю версию для обоих.
<!-- Spark framework to create restful endpoints -->
<dependency>
<groupId>com.sparkjava</groupId>
<artifactId>spark-core</artifactId>
<version>2.5.4</version>
</dependency>
<!-- HTMLUnit for crawling purposes -->
<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
<version>2.23</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-webapp</artifactId>
<version>9.3.6.v20151106</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-util</artifactId>
<version>9.3.6.v20151106</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.websocket</groupId>
<artifactId>websocket-client</artifactId>
<version>9.3.6.v20151106</version>
</dependency>
</dependencies>
</dependencyManagement>