Компиляция Maven с зависимостями, отсутствующими в POM

#java #maven #servlets #pom.xml

#java #maven #сервлеты #pom.xml

Вопрос:

Я пытаюсь создать проект Maven из work, который имеет servlet-api 3.1.0 в качестве предоставленной зависимости:

 <dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>3.1.0</version>
  <scope>provided</scope>
</dependency>
  

Но затем не удается скомпилировать, потому что он не может найти getRequestURL() from javax.servlet.http.HttpServletRequest .

Позже я узнал, что он использует более старую версию servlet-api, которую я никогда не включал в свой POM:

 Downloading from central: https://repo.maven.apache.org/maven2/javax/servlet/servlet-api/2.2/servlet-api-2.2.jar
Downloaded from central: https://repo.maven.apache.org/maven2/javax/servlet/servlet-api/2.2/servlet-api-2.2.jar (41 kB at 63 kB/s)
  

Возможно, эта версия servlet-api исходит из зависимости, но я не знаю, из какой, их много.

Как я могу переопределить эту версию той, которую я добавил в POM проекта?

Комментарии:

1. Вы пробовали запускать mvn dependency:tree ? Это должно показать вам, из какой зависимости оно исходит, а затем вы можете исправить это в качестве первого шага

2. Как сказал @mattfreake, это может быть временная зависимость.

3. * транзитивный …

4. @mattfreake Я не знал эту команду, спасибо! Я обнаружил commons-configuration:commons-configuration:jar:1.3 , что это зависит от более старого API сервлетов. Я думаю, что мог бы заменить его чем-то другим, но в случае, если я не смогу, как я могу справиться с этим конфликтом версий?

5. Я просто попытался добавить <type>jar</type> к commons-configuration зависимости, чтобы посмотреть, использует ли он только файл jar вместо всего POM, но то же самое.

Ответ №1:

Вы можете попробовать несколько вещей.

  1. Попробуйте mvn dependency:tree, чтобы узнать, загружается ли он как часть другой зависимости.

  2. Если вы не видите, что зависимость загружается как часть другой зависимости, очистите локальный репозиторий (он может быть внутри каталога .m2) и выполните чистую установку вашего приложения.

  3. вы также можете поделиться своим pom.xml чтобы другие могли взглянуть и помочь.

Комментарии:

1. Просто попробовал dependency:tree мой проект и обнаружил, commons-configuration:commons-configuration:jar:1.3 что зависит от более старого API сервлета. Я просто попытался добавить <type>jar</type> к commons-configuration зависимости, чтобы посмотреть, использует ли он только jar-файл вместо всего POM, но то же самое. Знаете ли вы какой-либо другой способ добиться этого?

2. Кстати, это вся трассировка зависимостей: commons-configuration:commons-configuration:jar:1.3 —> commons-jxpath:commons-jxpath:jar:1.2 —> javax.servlet:servlet-api:jar:2.2

3. Вы можете использовать исключения в вашем pom, чтобы исключить jar. Вы можете перейти по URL, если хотите узнать больше: maven.apache.org/guides/introduction /…