2010-11-11 32 views
5

Chúng tôi gặp vấn đề tại nơi tôi làm việc với việc tham chiếu nhiều dự án trong mã của chúng tôi. Về cơ bản, chúng tôi có một sản phẩm, mà tôi sẽ gọi là Leviathan. Dự án này có khá nhiều phiên bản khác, mỗi phiên bản mà chúng tôi duy trì như là các dự án riêng biệt trong Eclipse. Là nhà phát triển, chúng tôi thường có nhiều dự án (nhiều phiên bản) mở cùng lúc với Eclipse, vì chúng tôi nhận được các cuộc gọi đường dây trợ giúp về các phiên bản cũ hơn (cũng như phát triển đồng thời nhiều phiên bản).Làm thế nào tôi có thể tham khảo các thư viện trong một dự án khác trong Eclipse Helios?

Chúng tôi cũng có mã kiểm tra, trong một dự án khác nhau cho mỗi phân phối của Leviathan. Tôi tên dự án của tôi Leviathan_<branch name>. Vì vậy, ví dụ, trong không gian làm việc Eclipse của tôi, tôi có thể có các dự án như:

 
Leviathan_scott\ (my branch) 
Leviathan_9.2\ 
Leviathan_9.3\ 
Leviathan_10.0\ 
Leviathan_10.1\ 
Test_scott\ 
Test_10.0 

chi nhánh của tôi là một bản sao của thân cây của chúng tôi, vì vậy chúng tôi có thể xem xét rằng dòng phát triển tích cực nhất.

Vấn đề là chúng tôi tham khảo một số thư viện trong Leviathan \ lib trong mã thử nghiệm của chúng tôi. Mỗi nhà phát triển có thể đặt tên cho dự án của họ hơi khác nhau. Vì vậy, trong việc phát triển .classpath của dự án thử nghiệm, chúng tôi tham khảo dự án Leviathan \ (không bổ sung). Classpath cho dự án này (được kiểm tra vào hệ thống kiểm soát nguồn của chúng tôi) có thể trông giống như:

<?xml version="1.0" encoding="UTF-8"?> 
<classpath> 
    <classpathentry excluding="**/*.MySCMServerInfo" kind="src" path="src"/> 
    <classpathentry kind="lib" path="lib/abbot-1.0.2/abbot.jar"/> 
    <classpathentry kind="lib" path="lib/abbot-1.0.2/costello.jar"/> 
    <classpathentry kind="lib" path="lib/dbunit-2.4.8/dbunit-2.4.8.jar"/> 
    <classpathentry kind="lib" path="lib/easymock-3.0/easymock-3.0.jar" sourcepath="lib/easymock-3.0/easymock-3.0-sources.jar"> 
     <attributes> 
      <attribute name="javadoc_location" value="jar:platform:/resource/Test/lib/easymock-3.0/easymock-3.0-javadoc.jar!/"/> 
     </attributes> 
    </classpathentry> 
    <classpathentry kind="lib" path="lib/objenesis-1.2/objenesis-1.2.jar"/> 
    <classpathentry kind="lib" path="lib/privilegedAccessor-1.0.2/privilegedAccessor_1.0.2.jar"/> 
    <classpathentry kind="lib" path="lib/unitils-3.1/unitils-core/unitils-core-3.1.jar" sourcepath="lib/unitils-3.1/unitils-core/src"/> 
    <classpathentry kind="lib" path="lib/unitils-3.1/unitils-database/unitils-database-3.1.jar"/> 
    <classpathentry kind="lib" path="lib/unitils-3.1/unitils-dbmaintainer/unitils-dbmaintainer-3.1.jar"/> 
    <classpathentry kind="lib" path="lib/unitils-3.1/unitils-dbunit/unitils-dbunit-3.1.jar" sourcepath="lib/unitils-3.1/unitils-dbunit/src"/> 
    <classpathentry kind="lib" path="lib/unitils-3.1/unitils-inject/unitils-inject-3.1.jar"/> 
    <classpathentry kind="lib" path="lib/unitils-3.1/unitils-mock/unitils-mock-3.1.jar" sourcepath="lib/unitils-3.1/unitils-mock/src"/> 
    <classpathentry kind="lib" path="lib/unitils-3.1/unitils-orm/unitils-orm-3.1.jar"/> 
    <classpathentry kind="lib" path="lib/unitils-3.1/unitils-spring/unitils-spring-3.1.jar" sourcepath="lib/unitils-3.1/unitils-spring/src"/> 
    <classpathentry kind="lib" path="lib/unitils-3.1/unitils-testng/unitils-testng-3.1.jar" sourcepath="lib/unitils-3.1/unitils-testng/src"/> 
    <classpathentry kind="lib" path="data"/> 
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> 
    <classpathentry kind="lib" path="lib/unitils-3.1/unitils-core/lib/ognl-2.6.9.jar"/> 
    <classpathentry kind="lib" path="lib/testng-5.14.1/testng-5.14.1.jar" sourcepath="lib/testng-5.14.1/testng-5.14.1-src.zip"/> 
    <classpathentry combineaccessrules="false" kind="src" path="/Leviathan"/> 
    <classpathentry kind="lib" path="/Leviathan/lib/slf4j-api-1.6.1.jar"/> 
    <classpathentry kind="lib" path="/Leviathan/lib/hibernate3.jar" sourcepath="/Leviathan/lib/src/hibernate-3.6.0-src.zip"/> 
    <classpathentry kind="output" path="classes"/> 
</classpath> 

Khi một nhà phát triển tải dự án thử nghiệm vào/workspace Eclipse cá nhân của mình, anh/cô ấy sẽ cần phải liên kết dự án cho dự án Leviathan ban đầu bằng cách vào Preference-> Java Build Path-> Projects và thêm dự án Leviathan_scott.

Vấn đề là, điều này tất nhiên không thay đổi bất kỳ mục nhập nào trong số <classpathentry ... > tham chiếu đến "Leviathan \ lib". Vì vậy, chúng ta phải làm một trong hai điều:

  1. Thay đổi tất cả các tài liệu tham khảo từ Leviathan để Leviathan_<branch name> trong classpath của tôi sử dụng một trình soạn thảo văn bản tìm/thay thế.
  2. Xóa tất cả các tham chiếu đến Leviathan * .jar trong Đường dẫn xây dựng Java và thêm lại các lọ trong Leviathan_scott * .jar.

Vấn đề với điều này là cần phải thực hiện mỗi lần .classpath được thay đổi, điều này làm cho cả hai điều này có vẻ ít lý tưởng. Classpath của chúng tôi không thay đổi siêu thường xuyên, nhưng tôi sẽ nói rằng nó thay đổi một hoặc hai lần mỗi hai tuần. Tôi muốn có thể liên kết dự án của mình và chỉ phải thực hiện một bước để liên kết các dự án này.

Dường như chúng ta có thể thiết lập một biến môi trường trong Eclipse và thêm nó vào các mục .classpath. Nhưng, bây giờ chúng tôi có một vấn đề bởi vì nếu chúng tôi có nhiều dự án thử nghiệm trong không gian làm việc của chúng tôi mà chúng tôi muốn biên dịch, điều này sẽ không hoạt động. Cả hai mục .classpath của dự án thử nghiệm sẽ tham chiếu đến cùng một biến môi trường, tất nhiên chỉ có thể trỏ đến một vị trí siêu dự án.

Có vẻ như tôi có thể làm điều này, nhưng tôi không biết chính xác cách thực hiện nó trong Eclipse. Bất kỳ suy nghĩ sẽ được đánh giá rất cao.

~ Scott

+0

Apache Maven phân loại những vấn đề như quyến rũ. –

+0

Đồng ý, nhưng rất khó để có được 20 nhà phát triển chuyển sang hệ thống xây dựng mới ... Nếu chúng tôi * hoàn toàn * phải, tôi có thể tạo ra trường hợp đó, nhưng nếu có thể làm được, thì tôi muốn hoàn thành nó theo cách đó. – jwir3

Trả lời

2

Hãy thử sử dụng 'Biến lớp thông tin' của Eclipse.

Window->Preferences->Java->Build Path->Classpath Variables 

Xác định một hoặc nhiều biến như "Leviathan_under_test" và trỏ đến phiên bản bạn muốn kiểm tra. Sau đó, trong đường dẫn xây dựng dự án, hãy thay đổi tham chiếu thư viện để bao gồm biến.

Khi bạn thay đổi phiên bản Leviathan bạn muốn kiểm tra, bạn thay đổi biến và đi. Nếu bạn phải, bạn thậm chí có thể có nhiều biến cho các phiên bản được kiểm tra thường xuyên hơn, tức là "LEVIATHAN_LATEST", HOẶC "LEVIATHAN_PROBLEM_CHILD", v.v.

+0

Vâng, đây là những gì tôi có nghĩa là khi tôi nói về biến môi trường. Vì vậy, vấn đề ở đây là tôi vẫn cần phải thay đổi đường dẫn xây dựng - nếu, ví dụ, tôi muốn tải xuống Test_10.0 và Test_scott, và để chúng biên dịch trong cùng một không gian làm việc, tôi cần phải thay đổi biến trong .classpath tập tin trong ít nhất một trong hai dự án thử nghiệm. Lý tưởng nhất, chúng tôi muốn tránh điều này, bởi vì nó không thực sự tốt hơn so với những gì chúng tôi có tại thời điểm này - phải thay đổi Leviathan để Leviathan_scott hoặc một cái gì đó tương tự. – jwir3

+0

Trên thực tế, một khi biến nằm trong tệp .classpath, bạn không thay đổi nó; ít nhất là trong trường hợp $ LEVIATHAN chẳng hạn. Công trình xây dựng hoạt động với giá trị biến classpath mà bạn đã đặt trong không gian làm việc của mình. Bạn có thể trỏ nó đến một mục tiêu khác mà không phải chỉnh sửa các tệp trong dự án của bạn. –

+0

Vâng, không hoàn toàn. Làm thế nào tôi sẽ giải quyết vấn đề mà tôi có Leviathan_10.0, Leviathan_Test_10, Leviathan_scott, và Leviathan_test_scott trong vùng làm việc của tôi, tất cả đều mở cùng một lúc, và tôi muốn Leviathan_test_scott trỏ tới Leviathan_scott và Leviathan_test_10 để trỏ tới Leviathan_10.0? – jwir3

2

Đây là vấn đề quản lý phụ thuộc và có rất nhiều công cụ chuẩn để giúp đỡ! Tôi đề nghị bạn sử dụng ANT với Ivy's sự phụ thuộc Quản lý hoặc sử dụng Maven (hoặc bất kỳ công cụ xây dựng otehr nào có quản lý phụ thuộc).

Với một trong số đó, tôi cũng sử dụng một kho lưu trữ giả tạo như Nexus hoặc Artifactory, vì vậy bạn có một nguồn thực sự cho các tạo phẩm được xây dựng bên trong.

Bằng cách này, bạn sẽ luôn có phiên bản thư viện chuẩn mà bạn muốn, khi bạn muốn.

1

Nếu bạn không muốn sử dụng các công cụ bên ngoài để quản lý các phụ thuộc dự án khác nhau, bạn có thể thử đi đến các dự án Leviathan duy nhất Thuộc tính đường dẫn xây dựng, trong tab Đặt hàng và xuất, và kiểm tra các thư viện bạn cần để chạy kiểm tra. theo cách này, bạn không cần phải nhập các thư viện trong dự án thử nghiệm và bằng cách chuyển dự án đang được kiểm tra, bạn tự động cập nhật các thư viện

+0

Hm ... điều này có vẻ đầy hứa hẹn. Vì vậy, bạn đang nói thay vì nhập tất cả các thư viện một cách riêng biệt trong một dự án thử nghiệm, xuất chúng từ bên trong dự án leviathan gốc, thì tất cả những gì tôi phải làm là nhập dự án leviathan vào dự án thử nghiệm? – jwir3

+0

có, điều này có thể làm việc – pbanfi

Các vấn đề liên quan