Можно ли переопределить путь пакета зависимости Maven?

Вопрос или проблема

В моем проекте Maven я использую плагин jaxb2-maven-plugin, который использует зависимость com.sun.xml.bind.external:rngom. Проблема в том, что начиная с версии 2.2.11 rngom пакет org.kohsuke.rngom был перемещен в com.sun.tools.rngom. Я больше не могу использовать 2.2.11 как зависимость по причинам уязвимости.

Если я использую более новую версию, чем 2.2.11 com.sun.xml.bind.external:rngom, у меня возникает ошибка сборки, потому что классы больше не находятся в пакете: org.kohsuke.rngom, а в com.sun.tools.rngom.

Ошибка:

Exception in thread "main" java.lang.Error:
  java.lang.reflect.InvocationTargetException at
  com.sun.tools.xjc.reader.Ring.get(Ring.java:113) at
  com.sun.tools.xjc.reader.xmlschema.BGMBuilder.(BGMBuilder.java:147) at
  com.sun.tools.xjc.reader.xmlschema.BGMBuilder.build(BGMBuilder.java:117)
  at
  com.sun.tools.xjc.ModelLoader.annotateXMLSchema(ModelLoader.java:407)
  at com.sun.tools.xjc.ModelLoader.load(ModelLoader.java:162) at
  com.sun.tools.xjc.ModelLoader.load(ModelLoader.java:117) at
  com.sun.tools.xjc.Driver.run(Driver.java:354) at
  org.codehaus.mojo.jaxb2.javageneration.AbstractJavaGeneratorMojo.performExecution(AbstractJavaGeneratorMojo.java:468)
  at
  org.codehaus.mojo.jaxb2.AbstractJaxbMojo.execute(AbstractJaxbMojo.java:315)
  at
  org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
  at
  org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:210)
  at
  org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:156)
  at
  org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:148)
  at
  org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
  at
  org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
  at
  org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
  at
  org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
  at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305) at
  org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192) at
  org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105) at
  org.apache.maven.cli.MavenCli.execute(MavenCli.java:972) at
  org.apache.maven.cli.MavenCli.doMain(MavenCli.java:293) at
  org.apache.maven.cli.MavenCli.main(MavenCli.java:196) at
  sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
  sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  at
  sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:498) at
  org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:282)
  at
  org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:225)
  at
  org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:406)
  at
  org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:347)
  Caused by: java.lang.reflect.InvocationTargetException at
  sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
  at
  sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
  at
  sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
  at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at
  com.sun.tools.xjc.reader.Ring.get(Ring.java:102) ... 30 more Caused
  by: java.lang.Error: java.lang.reflect.InvocationTargetException at
  com.sun.tools.xjc.reader.Ring.get(Ring.java:113) at
  com.sun.tools.xjc.reader.xmlschema.BindGreen.(BindGreen.java:65) ...
  35 more Caused by: java.lang.reflect.InvocationTargetException at
  sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
  at
  sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
  at
  sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
  at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at
  com.sun.tools.xjc.reader.Ring.get(Ring.java:102) ... 36 more Caused
  by: java.lang.NoClassDefFoundError: org/kohsuke/rngom/nc/NameClass at
  com.sun.tools.xjc.reader.xmlschema.ct.ComplexTypeFieldBuilder.(ComplexTypeFieldBuilder.java:66)
  ... 41 more Caused by: java.lang.ClassNotFoundException:
  org.kohsuke.rngom.nc.NameClass at
  org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:50)
  at
  org.codehaus.plexus.classworlds.realm.ClassRealm.unsynchronizedLoadClass(ClassRealm.java:271)
  at
  org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:247)
  at
  org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:239)
  ... 42 more

Как можно решить эту проблему с зависимостями?

Ответ или решение

Ваша проблема заключается в том, что библиотека com.sun.xml.bind.external:rngom начиная с версии 2.2.11 переместила пакет org.kohsuke.rngom в com.sun.tools.rngom, что приводит к ошибкам совместимости с вашими текущими зависимостями. Чтобы решить эту проблему, можно рассмотреть несколько подходов:

1. Использование более новой версии зависимостей

Первым делом, нужно проверить, возможно ли обновление других зависимостей вашего проекта, чтобы они работали с новыми версиями rngom. Например, следующие шаги могут помочь:

  • Проверьте, поддерживают ли другие используемые вами плагины или библиотеки более новые версии rngom. Если они совместимы, обновите соответствующие зависимости в вашем pom.xml.

2. Исключение конфликтующих зависимостей

Если у вас есть зависимости, которые зависят от старой версии rngom, и вы не можете их обновить, попробуйте явно исключить старые зависимости и добавить новые. Например:

<dependency>
    <groupId>ваш.группа</groupId>
    <artifactId>ваш.артефакт</artifactId>
    <version>ваша.версия</version>
    <exclusions>
        <exclusion>
            <groupId>com.sun.xml.bind.external</groupId>
            <artifactId>rngom</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind.external</groupId>
    <artifactId>rngom</artifactId>
    <version>новая.версия</version>
</dependency>

3. Использование Shade плагина

В некоторых случаях может помочь использование плагина Maven Shade, который позволяет "упаковать" ваши зависимости вместе с вашим кодом, тем самым избегая проблем с конфликтующими классами. Добавьте maven-shade-plugin в ваш pom.xml:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.2.4</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

4. Рефакторинг вашего кода

Если указанные выше решения не подходят, возможно, вам нужно будет провести рефакторинг вашего кода, чтобы адаптироваться к новому пакету com.sun.tools.rngom. Это может включать:

  • Переписывание классов, которые ссылаются на старые пакеты, так чтобы они использовали новые имена классов.

Заключение

Наиболее оптимальным и устойчивым решением, как правило, является обновление зависимостей до актуальных версий, которые не имеют подобных проблем с совместимостью. Если это невозможно, попробуйте использовать исключения или Shade плагин. Если вы столкнетесь с трудностями, можете рассмотреть возможность получения помощи от сообщества или от разработчиков используемых вами библиотек.

Оцените материал
Добавить комментарий

Капча загружается...