2013-02-12 15 views
7

我現在面臨一個非常獨特的情況,需要一些建議: 我工作的這依賴於其他項目從我同一家公司的一個項目,現在我需要應用一些修改依賴。 我的問題是,依賴項的源代碼已經丟失,所以我唯一擁有的是存儲庫中的maven依賴項,以及相應的jar文件。 最重要的是,一些在使用JiBX解析器創建的Jar文件的類,映射一些XSD文件,我也沒有,所得類是合成的,我沒有發現反編譯器能夠正確處理它們。行家裝配之前替換類文件

所有這一切的唯一好處是類,我需要改變可適當反編譯,所以去了以下內容:

  • 我反編譯了整個jar文件,並結束了與一些類(JiBx的 )有空或實施錯誤的方法。
  • 我註釋掉的錯誤方法的身體有存根對象,應用所需的更改權類和重新編譯。
  • 我把舊的Jar文件,打開它,並手動替換爲新老班。

而導致罐發揮預期。

現在我的問題是:我可以做的一切使用Maven的?

的想法是把JiBX的類文件的資源,並保留存根等價物源文件,然後讓行家:

  • 編譯一切都像往常一樣,把所有的編譯的類文件 成目標文件夾
  • 從目標文件夾中刪除存根類文件並將其替換爲舊的預編譯類文件
  • 打包jar文件。

,你會推薦哪一種方法?

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的類不正確導入作爲依賴和如果我嘗試將任何CustmizableClass放入項目源中並讓JiBX的依賴項進行編譯,那麼編譯器會報告缺少的方法。

我也試過用窗簾插件的建議,但因爲我需要包括JiBX的類到我的源路徑,我會最終不得不包含進從JAR依賴包JiBX的類和編譯CustomizableClasses,但跳過從CustomizableClasses jar dep和編譯的JiBX類。

我看起來像它可以工作,但我承認我依然沒有找到這樣做的方式。任何線索都會非常受歡迎。

更新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並僅將其引用爲依賴關係會有什麼不利嗎? – 2013-02-12 10:59:02

+1

我可以用手動方式來做這件事,但這是我第二次需要在短時間內對其進行修改,並且我無法保證下一位開發人員能夠理解正在進行的操作,所以我寧願將其設置爲儘可能自動化。 – 2013-02-12 11:26:04

+0

另請參見http://stackoverflow.com/q/1832853/545127 – Raedwald 2013-02-21 00:53:48

回答

6

這是我會怎麼做:

  • 創建這個JAR文件的新的Maven項目,包裝類型罐子
  • 包括原始Jar文件作爲一個依賴
  • 在src文件夾中添加一個反編譯的.java文件

這應該讓你可以編譯.java文件,因爲jar文件中的其他類都可用。

您現在有兩個JAR文件:一個原始的,和一個應該只包含單一的編譯和改變類。

添加既您的應用程序類路徑可能會奏效,但將取決於classpath中的順序。

如果你想與一個jar文件就結了,我建議採取看看的Maven插件陰影http://maven.apache.org/plugins/maven-shade-plugin/),這將允許您創建多種來源的內容一個新的JAR文件。它將允許您過濾進入新Jar文件的內容。

Maven的陰影插件允許你指定從每個工件類都包括在內。它使用通配符併爲此包含/排除標記,如下所述:http://maven.apache.org/plugins/maven-shade-plugin/examples/includes-excludes.html

一旦創建了Jar文件,我將使用Maven Release插件釋放它,然後將該工件包含在下游。這將允許您僅在需要時更新修補過的Jar,它可能不必在每個構建版本上都有。但這取決於你的使用模式。

對於新的JAR文件的版本號,我建議使用原來的變化。使用相同的groupIdartifactId,然後修改版本號。如果原來有1.0.2,新,補丁文件應該被釋放1.0.2-1,以表明它的基礎上,1.0.2來源。如果您需要進行其他更改,請將其發佈爲1.0.2-2等等。這將使您很容易瞭解您的修補程序所基於的版本,並且增量修補程序編號會爲您提供區分版本的方法。

+0

哇,這是一個快速響應!聽起來像是一個選項,但我嘗試了類似的方法:創建一個只包含JiBX類的更薄的jar,並將其設置爲包含要修改的類的項目的依賴項。不知何故,它沒有在JiBX類中找到一些方法... – 2013-02-12 11:34:03

+0

您確定所有依賴項都在您創建的Jar文件中嗎?陰影插件將允許您指定要從原始Jar中重用的類,然後添加自己的。我建議使用原始版本的修改版本來釋放生成的Jar(請參閱答案,我已經添加了一些細節)。 – nwinkler 2013-02-12 12:12:44

+0

nwinkler方法應該工作。也許在你的過程中出了問題。也許有關稀釋劑罐的版本或內容的一些混淆.. – 2013-02-12 12:40:06