程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 為Eclipse Galileo打補丁

為Eclipse Galileo打補丁

編輯:關於JAVA

本文討論在 Eclipse 中應用補丁,包括在 Eclipse Galileo 中引入的一個功能。要利用本篇文章中的示例,您需要安裝 Eclipse 並且有一個可用的源代碼庫,如 Subversion(SVN)或 Concurrent Versions System(CVS)。

問題

Eclipse 集成開發環境(IDE)通過提供一些功能來促進團隊環境中的工作。這些功能使您可以直接在 IDE 中與源代碼控制管理系統進行集成。它們不僅能夠使您獲得源代碼、查看並提交更改,還提供了通過把補丁應用到代碼來處理更改的能力。

補丁可以以文件的形式交換,其中含有使用標准 diff 格式的代碼版本之間的更改。正確創建後,補丁文件只包含修改後的文件與您的工作空間中的文件之間存在差異的地方。這不僅可以使補丁文件變得更小,而且能夠更容易、更有選擇地運用補丁。

在團隊開發環境中,有時需要直接在開發人員之間共享對代碼庫的更改。使用補丁文件的不同場景包括:

來自團隊外部的更改 — 例如,在開源代碼中,更改可能來自社區的某個人。

出於某些原因,更改無法提交到當前源代碼樹中,比如將會影響編譯的重大更改。

更改很復雜,而且在提交到源代碼管理系統中之前需要與其他的更改進行整合。

補丁文件的一個優勢在於它能夠作為電子郵件消息的附件或者 bug 報告進行提交。然後,可以把補丁文件應用到源代碼中以整合修改後的代碼。

補丁格式概覽

在 Eclipse 中創建補丁時,補丁是以統一的 diff 格式進行編寫的。這意味著您可以從 CVS 或 SVN 中創建 diff 並把它們應用到 Eclipse 項目中。它還意味著對於補丁文件,您可以依靠一個標准格式,因此,它們很容易就可以進行共享。diff 文件有幾種格式。

了解補丁文件的格式對於理解如何在 Eclipse 中應用它們並不是很重要,但對 Eclipse 使用的 diff 文件格式有一定的了解能夠幫助您解決問題並幫助您了解應用補丁時將會發生什麼。

例如,請參見清單 1 中的簡單 Motorcycle 類。在本文中,它是一個基准示例。您將對其進行修改,而且通過這個示例,您將了解補丁文件是如何出現在後面的示例中的。

清單 1. 示例 Motorcycle 類

package com.nathangood.examples;

public class Motorcycle {

   private int cc;
   private String model;
   private String make;
   private String year;

   public String getModel() {
     return model;
   }

   public int getCc() {
     return cc;
   }

   public void setCc(int cc) {
     this.cc = cc;
   }

   public void setModel(String model) {
     this.model = model;
   }

   public String getMake() {
     return make;
   }

   public void setMake(String make) {
     this.make = make;
   }

   public String getYear() {
     return year;
   }

   public void setYear(String year) {
     this.year = year;
   }
}

在類中添加一個簡單的構造函數,如 清單 2 中的構造函數。

清單 2. 一個使用 make 的簡單的構造函數

public Motorcycle(String make) {
     super();
     this.make = make;
   }

現在,當您在修改後的類和類的原始版本之間生成一個統一的 diff 時,您的 diff 將如清單 3 中所示。

清單 3. 用來添加構造函數的補丁

Index: src/com/nathangood/examples/Motorcycle.java
===================================================================
--- src/com/nathangood/examples/Motorcycle.java  (revision 3)
+++ src/com/nathangood/examples/Motorcycle.java  (working copy)
@@ -7,6 +7,11 @@
    private String make;
    private String year;

+  public Motorcycle(String make) {
+    super();
+    this.make = make;
+  }
+
    public String getModel() {
      return model;
    }

補丁文件只包含已添加的新行數,以及前後若干行,用來提供更改的上下文。

注意補丁文件中的如下行:@@ -7,6 +7,11 @@。該行提供了行號,緊接著是它的更改范圍。每個更改前的減號(-)或加號(+)與行上方的文件名一致。在這個示例中,- 指的是修訂 3,而 + 指的是工作副本。

工作副本(文件的新版本)中的更改從第 7 行開始,共有 11 行,其中包括顯示上下文的行。文件的原始版本(在這個示例中叫作修訂 3)只包含了 6 行。這兩個版本的區別在於前面標有 + 的 5 個新行。

看看另外一個示例,刪除 make 變量、getMake() 和 setMake() 的訪問器(accessor)— 暫時不考慮構建函數的更改。顯示這些區別的補丁如清單 4 所示。

清單 4. 使用補丁刪除元素的示例

Index: src/com/nathangood/examples/Motorcycle.java
===================================================================
--- src/com/nathangood/examples/Motorcycle.java  (revision 3)
+++ src/com/nathangood/examples/Motorcycle.java  (working copy)
@@ -23,14 +23,6 @@
      this.model = model;
    }

-  public String getMake() {
-    return make;
-  }
-
-  public void setMake(String make) {
-    this.make = make;
-  }
-
    public String getYear() {
      return year;
    }

從補丁中可以看到,更改的上下文從存儲庫(修訂 3)中的文件版本的第 23 行開始,共有 14 行。由於已經刪除了文件中的行,所以新的更改的上下文也從第 23 行開始,僅僅只有 6 行。要刪除的行以 - 開頭。

最後看看原始文件的一個修改(同樣不考慮最近的一次更改)。更改在清單 5 中以粗體顯示,演示了從 cc 到 cubicCentimeters 的重命名。

清單 5. 使用補丁修改元素的示例

Index: src/com/nathangood/examples/Motorcycle.java
===================================================================
--- src/com/nathangood/examples/Motorcycle.java  (revision 3)
+++ src/com/nathangood/examples/Motorcycle.java  (working copy)
@@ -2,7 +2,7 @@

  public class Motorcycle {

-  private int cc;
+  private int cubicCentimeters;
    private String model;
    private String make;
    private String year;
@@ -11,12 +11,12 @@
      return model;
    }

-  public int getCc() {
-    return cc;
+  public int getCubicCentimeters() {
+    return cubicCentimeters;
    }

-  public void setCc(int cc) {
-    this.cc = cc;
+  public void setCubicCentimeters(int cubicCentimeters) {
+    this.cubicCentimeters = cubicCentimeters;
    }

    public void setModel(String model) {

顯示更改的補丁要比簡單的添加或刪除更為復雜一些,這是因為它要結合這兩者來顯示更改。

第一處更改的上下文從第 2 行開始,共有 7 行。雖然刪除了一行,但又添加了一行,所以修改後的文件上下文的范圍不變。含有 cc 的原始行被含有 cubicCentimeters 的新行替換了。文件中的第二處修改采用同樣的方式,上下文從第 11 行開始,一共 12 行。

創建一個簡單的補丁

現在了解了補丁文件的基本結構,您可以在 Eclipse 中創建一個補丁,並把它應用到另外一個工作空間的相同項目中。如果您想在同一個工作空間中浏覽這些示例,只需在 Eclipse 的源代碼控制中修改某個文件即可。創建一個補丁並還原到文件的原始版本。然後重新應用補丁,您會發現所做的修改又回來了。

在 Motorcycle 類的原始版本中,使用 Source 菜單生成幾個構造函數,如清單 6 中所示。

清單 6. 新構造函數的示例


   public Motorcycle() {
     super();
   }

   public Motorcycle(int cc, String model, String make, String year) {
     super();
     this.cc = cc;
     this.model = model;
     this.make = make;
     this.year = year;
   }

在 Eclipse 中,打開項目的上下文菜單(通常按下鼠標的右鍵),然後選擇 Team > Create Patch。

在 Create Patch 窗口,選擇 Save in File System(請參見圖 1),然後單擊 Browse 為新補丁文件找到一個合適位置。結束後單擊 Next。

圖 1. 創建補丁

下一步,選擇 Project(請參見圖 2),然後單擊 Finish。您可以為工作空間中的多個項目創建一個補丁。選擇 Project 時,Eclipse 會創建補丁,把當前項目作為補丁的根目錄並忽略其他項目中的更改。把補丁范圍限定在您的項目中能使事情變得簡單些,因為這樣可以減少您要檢查的更改的數量。

圖 2. 選擇補丁根目錄

查看補丁

當 Eclipse 創建好補丁文件後,您可以通過單擊 File > Open File 打開文件,在 Eclipse 中查看補丁。補丁將如清單 7 所示。

清單 7. 添加新構造函數的補丁

Index: src/com/nathangood/examples/Motorcycle.java
===================================================================
--- src/com/nathangood/examples/Motorcycle.java  (revision 3)
+++ src/com/nathangood/examples/Motorcycle.java  (working copy)
@@ -6,7 +6,19 @@
    private String model;
    private String make;
    private String year;
-
+
+  public Motorcycle() {
+    super();
+  }
+
+  public Motorcycle(int cc, String model, String make, String year) {
+    super();
+    this.cc = cc;
+    this.model = model;
+    this.make = make;
+    this.year = year;
+  }
+
    public String getModel() {
      return model;
    }

在 Package Explorer 中應用補丁

如果您只有一個可用的單一工作空間,那麼還原您對 Motorcycle.java 所做的更改。另外一個辦法就是使用一個存放有項目文件原始版本的工作空間。

在項目的原始版本中,使用 Team > Apply Patch 上下文菜單項打開圖 3 中顯示的 Apply Patch 向導。選擇 File,然後單擊 Browse,查找您在 “創建一個簡單的補丁” 中創建的補丁文件的位置。

圖 3. 選擇補丁的輸入

由於您是在項目而非工作空間根目錄的基礎上創建了補丁,選擇 Apply the patch to the selected file,然後選擇列表(請參見圖 4)中的項目文件夾。單擊 Next。

圖 4. 選擇補丁的目標

下一個屏幕(如圖 5 所示)顯示了原版(Local Copy)和修訂版(After Patch)的對比。由於這是個 Java™ 文件,Java Structure Compare 部分以概要的形式顯示了文件中的區別,這在一定程度上有助於理解。

圖 5. 應用更改之前進行檢查

如果您對顯示的更改進行了確認,單擊 Finish。

現在當你打開文件時,它包含了您前面所做的更改。

使用 Eclipse Galileo 應用補丁的一個替代辦法就是把內容粘貼到 Package Explorer 視圖中。如果您已經安裝了 Eclipse Galileo,您可以根據下面的步驟應用您創建的補丁:

在文本編輯器中打開您創建的補丁文件。

把文件內容復制到剪切板。

在 Package Explorer 中,右鍵單擊項目,然後在上下文菜單中選擇 Paste。

應用來自一個文件的補丁時,按照向導所示進行操作。

應用補丁的選項

在 圖 5 顯示的 Review Patch 這一步中,有幾個有關應用補丁的選項。前一個示例中的簡單補丁不需要在 Review Patch 步驟中對默認選項作任何更改。但是,當您在檢查補丁以獲得您想要的結果時,有些情況下可能需要修改設置。

應用補丁時,有時在 Review Patch(請參見圖 6)步驟期間在 Patch Contents 列表中會出現錯誤。這表示您需要修改一些補丁選項。

圖 6. 應用補丁時處理錯誤

如果補丁中的原始目錄結構與您應用補丁的版本不一樣,Ignore leading path name segments 選項特別有用。您可以通過創建項目補丁和在 Apply Patch 向導的 Target Resource 步驟(圖 4)中選擇 src 文件夾來模擬這個行為。這將會報錯(如圖 6),但如果您把 Ignore leading path name segments 的值改為 1,Eclipse 就能夠正確地應用補丁。

Show matched hunks 選項在 Patch Contents 列表中顯示行號和上下文。

Fuzz factor 選項使您能夠告訴 Eclipse 在應用補丁時忽略一些上下文行。在本文的示例中,可以通過使用 Source > Sort Members 菜單選項在嘗試應用補丁之前歸類原始文件,從而模擬對 Fuzz factor 的需求。由於一些上下文行現在會出現問題,您需要用 Fuzz factor 來正確地應用補丁。單擊 Guess,Eclipse 會盡最大努力為您查找 Fuzz factor,或者您可以不斷修改設置直到您對更改滿意為止。

Show Excluded 選項顯示排除的補丁操作(如果有的話)。

Generate a .rej file for unmerged hunks 存放了操作過程中沒有被應用的補丁文件的條目。要查看這個行為的實際效果,可以使用含有新構造函數的補丁,但是在應用之前,輸入您自己的、稍微有差異的構造函數 — 如清單 8 中所示。

清單 8. 添加一個本地構造函數,形成一個沖突

public Motorcycle() {
     // TODO: Create some conflict with this constructor
   }

當你嘗試應用補丁時,補丁文件中的代碼和 Motorcycle 類中的代碼將會發生一個沖突。這個沖突不會被應用到已修改的文件中。相反,它將會被寫到一個叫 Motorcycle.java.rej 的文件中,如清單 9 所示。

清單 9. 被拒絕的補丁代碼

@@ -5,6 +5,10 @@
    private String model;
    private String make;
    private String year;
+
+  public Motorcycle() {
+    super();
+  }

    public String getModel() {
      return model;

清單 9 中顯示的文件並不是一個完整有效的補丁文件。但如果先解決了沖突的話,您就能夠使用它來為這個類創建一個補丁。

在 Synchronize View 中創建一個補丁

使用代碼庫同步更改後,另一個辦法是在 Synchronize View 中創建補丁。要在 Synchronize View 中創建補丁,打開 Team Synchronizing 透視圖,然後單擊同步按鈕,如圖 7 所示。

圖 7. 同步按鈕

在 Synchronize View 中打開項目的上下文菜單,然後單擊 Create Patch。從這開始,按照 “創建一個簡單的補丁” 中所描述的補丁創建流程進行操作。

逆向補丁

逆向補丁指反向執行應用補丁的動作。添加行變成了刪除行。補丁中將被刪除的行將被添加。您可以使用逆向補丁恢復文件的前一個版本的某些更改或者從造成問題的補丁中撤銷更改。

結束語

Eclipse 團隊工具使您能夠使用標准統一的 diff 格式的補丁輕松共享代碼更改。現在團隊成員能夠應用以文件形式作為附件進行提交的補丁,這可通過使用一個新方法實現:在 Eclipse Galileo 的 Package Explorer 中粘帖補丁內容。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved