2013-02-12 2 views
7

Мне очень нужна уникальная ситуация и мне нужен совет: Я работаю над проектом, который зависит от другого проекта от моей же компании, и теперь мне нужно применить некоторые изменения к зависимость. Проблема, которая у меня есть, заключается в том, что исходный код из зависимостей был потерян, поэтому единственное, что у меня есть, - это зависимость от maven в репозитории, с соответствующим файлом jar. Кроме того, некоторые классы в файле Jar, созданные с использованием парсера JiBX, отображающие некоторые файлы XSD, которые у меня отсутствуют, и полученные классы являются синтетическими, и я не нашел декомпилятора, способного правильно их обрабатывать.Заменить файлы классов перед сборкой maven

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

  • Я декомпилированы весь файл банку и в конечном итоге с некоторыми классами ( JiBx) с пустым или ошибочно реализованным методом.
  • Я прокомментировал тело неправильных методов, чтобы иметь объекты-заглушки, применил необходимые изменения к правильным классам и перекомпилировал.
  • Я взял старый файл Jar, открыл его и вручную заменил старый класс на новый.

И полученный Jar работал должным образом.

Теперь мой вопрос: могу ли я сделать все это с помощью Maven?

Идея заключается в том, чтобы поместить файлы классов JiBX как ресурсы, и сохранить заглушки эквивалентов в качестве исходных файлов, а затем пусть Maven:

  • Компиляции все как обычно, вкладывая все скомпилированные файлы классов в цель folder
  • Удалить файлы классов-заглушек из целевой папки и заменить их на старые файлы с предварительно скомпилированными файлами
  • пакет банку.

Какой подход вы бы порекомендовали?

UPDATE

Даю еще некоторые подробности о структуре проекта зависимость:

Все классы в том же пакете: классы

my.project.domain.JiBX__c_GeneratedObfuscatedClass1.java 
my.project.domain.JiBX__c_GeneratedObfuscatedClass2.java 
my.project.domain.JiBX__c_GeneratedObfuscatedClass3.java 
my.project.domain.CustomizableClass1.java 
my.project.domain.CustomizableClass2.java 
my.project.domain.CustomizableClass3.java 

JiBX не импортируются правильно, как зависимость и если я попытаюсь поместить любой из CustmizableClasses в источник проекта и позволить JiBX-членам быть зависимыми, компилятор сообщает о отсутствующих методах.

Я также пробовал использовать Shade Plugin, как было предложено, но так как мне нужно включить классы JiBX в исходный путь, мне придется включить в классы JiBX из jar-зависимостей и скомпилировать CustomizableClasses, но пропустить CustomizableClasses из jar dep и скомпилированные классы JiBX.

Похоже, он может работать, но я признаю, что до сих пор не нашел способ сделать это. Любые подсказки будут очень приветствоваться.

UPDATE 2 (РАЗРЕШЕНИЕ)

Я здесь объяснить, как я, наконец, удалось это с помощью плагина тени, как это предлагается, только в случае, если кто-то должен делать то же самое:

я, наконец, создал проект с декомпилированными классами внутри одного и того же пакета, и оставили методы, которые не хотят декомпилироваться, закомментированы.

В pom.xml я добавил следующее:

<build> 
<plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-shade-plugin</artifactId> 
     <version>2.0</version> 
     <executions> 
      <execution> 
       <phase>package</phase> 
       <goals> 
        <goal>shade</goal> 
       </goals> 
       <configuration> 
        <artifactSet> 
         <includes> 
          <include>${project.groupId}:${project.artifactId}</include> 
          <include>TheDamnedProject:WithoutSources</include> 
         </includes> 
        </artifactSet> 
        <filters> 
         <filter> 
          <artifact>TheDamnedProject:WithoutSources</artifact> 
          <includes> 
           <!-- These classes will be taken directly from dependency JAR --> 
           <include>my/package/ClassWhichCouldNotBeDecompiled1.class</include> 
           <include>my/package/ClassWhichCouldNotBeDecompiled2.class</include> 
           <include>my/package/ClassWhichCouldNotBeDecompiled3.class</include> 
           <include>my/package/ClassWhichCouldNotBeDecompiled4.class</include> 
          </includes> 
         </filter> 
         <filter> 
          <artifact>${project.groupId}:${project.artifactId}</artifact> 
          <excludes> 
           <!-- These classes will be overridden by the ones inside the JAR --> 
           <exclude>my/package/ClassWhichCouldNotBeDecompiled1.class</exclude> 
           <exclude>my/package/ClassWhichCouldNotBeDecompiled2.class</exclude> 
           <exclude>my/package/ClassWhichCouldNotBeDecompiled3.class</exclude> 
           <exclude>my/package/ClassWhichCouldNotBeDecompiled4.class</exclude> 
          </excludes> 
         </filter> 
        </filters> 
       </configuration> 
      </execution> 
     </executions> 
    </plugin> 
</plugins> 

спасибо!

Карлес

+1

Вам нужно, чтобы это происходило динамически?Будет ли недостаток в развертывании вашего измененного JAR и просто ссылка на него как зависимость? –

+1

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

+0

См. Также http://stackoverflow.com/q/1832853/545127 – Raedwald

ответ

6

Вот как я бы это сделать:

  • Создать новый проект Maven для этого Jar файла, с типом упаковки банку
  • Включить оригинальный Jar-файл в качестве зависимости
  • Добавить один декомпилированный файл .java в папку src

Это должно привести к тому, что файл .java может быть скомпилирован, поскольку доступны другие классы из файла jar.

Теперь у вас есть два файла Jar: один оригинал и один, который должен содержать только один перекомпилированный и измененный класс.

Добавление обоих путей вашего приложения может работать, но будет зависеть от порядка в пути к классам.

Если вы хотите, чтобы в конечном итоге с одной баночки файл, я рекомендую взглянуть на Maven плагин Shade (http://maven.apache.org/plugins/maven-shade-plugin/), что позволит вам создать новый Jar файл с содержимым из нескольких источников. Это позволит вам фильтровать то, что входит в новый файл Jar.

Плагин Maven Shade позволяет указать, какие классы из каждого артефакта включены. Он использует подстановочные знаки и включает/исключает теги для этого, как описано здесь: http://maven.apache.org/plugins/maven-shade-plugin/examples/includes-excludes.html

После создания этого файла Jar я выпустил его с использованием плагина Maven Release, а затем включил этот артефакт ниже по течению. Это позволит вам обновлять исправленный Jar, когда это действительно необходимо, возможно, это не обязательно для каждой сборки. Но это зависит от вашей модели использования.

Для номера версии нового файла Jar я рекомендую использовать вариант оригинальной версии. Используйте те же groupId и artifactId, а затем измените номер версии. Если у оригинала 1.0.2, ваш новый исправленный файл должен быть выпущен как 1.0.2-1, чтобы указать, что он основан на источниках 1.0.2. Если вам нужно внести дополнительные изменения, отпустите это как 1.0.2-2 и так далее. Это упростит понимание того, на какой основе основаны ваши исправления, а число добавочных патчей даст вам возможность отличать выпуски.

+0

Вау, это был быстрый ответ! Звучит как опция, но я попробовал нечто подобное: создал более тонкую банку, содержащую только классы JiBX, и установил ее как зависимость проекта, содержащего классы для изменения. Как-то он не нашел в JiBX-методах некоторых методов ... –

+0

Вы уверены, что все зависимости находятся в файле Jar, который вы создали? Плагин Shade позволит вам указать классы, которые вы хотите повторно использовать из оригинальной Jar, а затем добавить свой собственный. Я рекомендую освободить полученный Jar, используя модифицированный номер версии оригинала (см. Ответ, я добавил некоторые подробности). – nwinkler

+0

Подход nwinkler должен работать. Возможно, что-то пошло не так в вашем процессе. Может быть, какая-то путаница в отношении версии или содержимого более тонкой банки ... –

Смежные вопросы