2015-11-20 2 views
0

Я хочу исправить класс java библиотеки, которую я использую в военном проекте.Класс переопределения в библиотеке, используемой в веб-проекте

Я переопределяю класс с новым классом с таким же каноническим именем, но в веб-приложении исходный класс по-прежнему загружается первым. Как я могу контролировать порядок загрузки классов?

Я начал с этим поста, и о JAR прочитанного Аде: Override class in java

И использовал Maven примера найти здесь: http://owenou.com/2010/07/20/patching-with-class-shadowing-and-maven.html

основном является Подсобным проектом, который зависит от новой исправленной баночки с классом overriden и исходной библиотекой, с MANIFEST.MF с этими библиотеками в правильном порядке в classpath. Таким образом, другие проекты могут использовать этот вспомогательный проект.

Это прекрасно работает в автономном приложении, но в веб-проекте оригинальная банка все еще загружается первым.

Любая помощь?

ответ

1

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

Другим решением является изменение порядка пути к классам, поэтому ваша версия предшествует старой. От java documentation:

Спецификация заказа

Порядок, в котором указать несколько записей пути класс важен. Java-интерпретатор будет искать классы в каталогах в порядке их появления в переменной пути класса. В приведенном выше примере интерпретатор Java сначала ищет нужный класс в каталоге C: \ java \ MyClasses. Только если он не найдет класс с соответствующим именем в этом каталоге, интерпретатор будет выглядеть в каталоге C: \ java \ OtherClasses.

Обратите внимание, что оба решения очень грязные, и будущая модификация вашего кода может нарушить ваши функции (например, изменить путь к классу или обновить банку).

Лучший способ будет один из следующих действий:

  • расширяет класс и использовать только новый класс
  • реализует тот же интерфейс в новом классе и использовать его
+0

Ну, это класс утилиты, используемый во внешнем банке, который не контролируется мной, я не могу расширить класс. Я заменил непосредственно класс в банку, но, как вы говорите, это не очень правильно. Переупорядочение переходов классов - это то, что не работает в веб-проекте. – antgar9

0

Если вы управляете клиентом приложения, вы можете попытаться сыграть с банкой во время работы:

Посмотрите это для загрузки How to load a jar file at runtime

Если вы хотите также разгрузки: Dynamic loading and unloading of jar

Или, вы можете попробовать запустить в вашем веб-приложение, в «загрузки», прецедент трюк. Тогда вы будете уверены, какие классы вы получите.

0

У меня была такая же проблема, и вот что я сделал, чтобы заставить ее работать. Мой проект включал библиотеку «ThisProject», содержащую класс ServiceFactory.java, вызывающий ошибку.

<dependencies> 
    <dependency> 
     <groupId>com.example.ThatGroup</groupId> 
     <artifactId>ThatProject</artifactId> 
     <version>${ThatProject.version}</version> 
    </dependency> 
</dependencies> 

В моем проекте я создал тот же класс, чтобы затенить одну из «ThatProject» (путь должен соответствовать). → src \ main \ java \ com \ example \ ThatGroup \ ThatProject \ ServiceFactory.java

В моем pom.xml я использовал плагин maven-shade-plugin следующим образом. Обратите внимание, как я исключаю исходную версию ServiceFactory.java из библиотеки «ThisProject».

<build> 
    <plugins> 
     <plugin> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>${maven-compiler-plugin.version}</version> 
      <configuration> 
       <source>${java.version}</source> 
       <target>${java.version}</target> 
      </configuration> 
     </plugin> 
     <!-- Include all dependencies in JAR --> 
     <plugin> 
      <artifactId>maven-shade-plugin</artifactId> 
      <version>2.2</version> 
      <executions> 
      <execution> 
       <id>shade</id> 
       <goals> 
       <goal>shade</goal> 
       </goals> 
       <phase>package</phase> 
       <configuration> 
       <createDependencyReducedPom>false</createDependencyReducedPom> 
       <filters> 
        <filter> 
        <artifact>com.example.ThatGroup:ThatClient</artifact> 
        <excludes> 
         <exclude>com/example/ThatGroup/ThatProject/ServiceFactory.class</exclude> 
        </excludes> 
        </filter> 
       </filters> 
       </configuration> 
      </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

И все, это, наконец, сработало для меня. В моем случае я включил все файлы моего проекта с этой конфигурацией pom.xml (включая мою теневую версию ServiceFactory.java). Как уже упоминалось, исходный ServiceFactory.java был исключен во время сборки maven.

Надеюсь, это поможет!