2012-04-27 25 views
6

Tôi đang xây dựng một ứng dụng RCP sẽ được tạo thành từ một số Tính năng.Làm thế nào để xây dựng một ứng dụng RCP Eclipse để các tính năng của nó có thể được cập nhật tự động?

Ứng dụng RCP của tôi được định cấu hình để kiểm tra cập nhật mỗi lần khởi động. Vấn đề hiện tại của tôi là tôi cần một trong các tính năng của tôi để được 'Cài đặt' vào lúc xây dựng để nó sẽ được cập nhật trong khi kiểm tra tự động cập nhật này mà không buộc người dùng phải tự cài đặt nó. Tôi cần tính năng này để cập nhật độc lập với các tính năng khác trong hệ thống. Vì vậy, để tóm tắt lại, tôi chỉ tìm kiếm một cách tự động tốt để cài đặt Tính năng trong ứng dụng RCP theo cách cập nhật độc lập với các tính năng khác và không yêu cầu người dùng RCP ứng dụng để cài đặt thủ công.

Trả lời

2

Trong khi đó, Tycho có hỗ trợ rõ ràng cho trường hợp sử dụng này. Bắt đầu với Tycho 0.20.0, bạn có thể đặt các tính năng cài đặt Tycho của RCP riêng biệt với sản phẩm. Bằng cách này, các tính năng này có thể được cập nhật (hoặc thậm chí được gỡ cài đặt) độc lập với sản phẩm.

Để cài đặt các tính năng độc lập, chỉ cần thêm thuộc tính installMode="root" vào các thẻ đối tượng tương ứng trong tệp sản phẩm. Ví dụ:

<features> 
    <feature id="org.eclipse.platform"/> 
    <feature id="updatable.feature" installMode="root"/> 
</features> 

Để biết thêm thông tin, hãy xem this documentation page.

+0

Tôi có thể tìm tệp này ở đâu .product? – Wearybands

5

Sau một tìm kiếm dài, tôi đã tìm thấy câu trả lời. Đó là loại kludge, nhưng tôi sẵn sàng làm bất cứ điều gì vào thời điểm này. Giải pháp của tôi phụ thuộc vào thực tế là ứng dụng RCP được xây dựng của tôi bao gồm ứng dụng p2 org.eclipse.equinox.p2.director. Tôi đoán nếu ứng dụng RCP của bạn không chứa ứng dụng này, bạn có thể tham khảo một bản cài đặt Eclipse khác để khởi chạy Giám đốc. Tôi chỉ làm theo cách này để tránh việc có một cá thể của Eclipse đang ngồi trên máy xây dựng của tôi.

Tôi đã sử dụng danh sách gửi thư p2-dev và Paul Webster đã trả lời câu hỏi của tôi. (Cảm ơn Paul)

Ông đề xuất sử dụng kiến ​​để khởi chạy ứng dụng đạo diễn p2 để cài đặt IU vào ứng dụng RCP được xây dựng của tôi.

Dưới đây là câu trả lời của mình trên p2-dev mailing list http://dev.eclipse.org/mhonarc/lists/p2-dev/msg04735.html

Dưới đây là các mục tiêu kiến ​​tôi đã đưa ra.

<target name="install_IU"> 
    <path id="launcher.paths"> 
    <fileset 
     dir="${app.dir}" 
     includes="plugins/org.eclipse.equinox.launcher_*" /> 
    </path> 
    <property 
     name="launcherPath" 
     refid="launcher.paths" /> 
    <echo>-installIU ${iu.id} </echo> 
    <java 
     jar="${launcherPath}" 
     failonerror="false" 
     dir="${app.dir}" 
     timeout="900000" 
     fork="true" 
     output="${basedir}/director.log" 
     resultproperty="directorcode"> 
     <arg line="-application org.eclipse.equinox.p2.director" /> 
     <arg line="-noSplash" /> 
     <arg line="-installIUs ${iu.id}" /> 
     <arg line="-repository ${iu.repo}" /> 
     <arg line="-destination ${app.dir}" /> 
     <arg line="-bundlepool ${app.dir}" /> 
    </java> 

    <zip destfile="${app.zip}" 
    basedir="${app.dir}"/> 
</target> 

Tôi đặt tệp này vào một tệp kiến ​​trong cùng một dự án tạo ứng dụng RCP Eclipse của tôi thông qua Tycho. Tycho sản xuất xây dựng hiện vật của tôi trong một thư mục gọi là "mục tiêu" vì vậy các thông số của tôi với mục tiêu kiến ​​trên cái nhìn như thế này ...

<target name="modify_x86"> 
    <antcall target="install_IU"> 
    <param name="iu.id" value="com.mydomain.the.feature.i.want.to.install.feature.feature.group"/> 
    <param name="iu.repo" value="http://mydomain.com/thep2repository/where/i/deploy/the/feature/to/install"/> 
    <param name="app.dir" value="${basedir}/target/products/com.mydomain.myRCPapplication/win32/win32/x86"/> 
    <param name="app.zip" value="${basedir}/target/products/com.mydomain.myRCPapplication-win32.win32.x86.zip"/> 
    </antcall> 
</target> 

Tôi có một vài chi tiết của các mục tiêu cho mỗi nền tảng rằng ứng dụng RCP của tôi được xây dựng cho.

Hy vọng điều này sẽ hữu ích.

CẬP NHẬT: 8 tháng 5 năm 2014. Tobias đã thu hút sự chú ý của tôi rằng tôi nên thay đổi câu trả lời được chấp nhận từ câu trả lời này thành câu trả lời có tính năng mới được thêm vào Tycho 0.20.0. thời trang đơn giản hơn nhiều. Vì vậy, câu trả lời được chấp nhận mới là giải pháp thích hợp cho câu hỏi này ngay bây giờ.

+1

FYI, đây là lý do tại sao điều này hoạt động: Đầu tiên Tycho gọi nội bộ một giám đốc p2 (nhúng) và cài đặt sản phẩm IU. Sau đó, bạn gọi cho giám đốc một lần nữa và cài đặt tính năng IU. Kết quả cài đặt sau đó có hai "IU gốc" (nghĩa là các điểm vào trong khoảng thời gian cài đặt). Kiểm tra các bản cập nhật sẽ kiểm tra từng IU gốc cho các phiên bản mới hơn - vì vậy, tính năng của bạn sẽ được cập nhật khi có phiên bản mới hơn có sẵn trong kho được định cấu hình. – oberlies

+0

Tôi đã có tin tốt: Tycho hiện có [hỗ trợ rõ ràng cho trường hợp sử dụng này] (http://wiki.eclipse.org/Tycho/Release_Notes/0.20), vì vậy bạn có thể có thể loại bỏ khoảng một dặm pom. xml cấu hình ;-) – oberlies

+0

Cảm ơn, tôi đã gỡ bỏ mã ant cũ từ trên và tận dụng lợi thế của tính năng mới. Tôi là một trong 18 cử tri về lỗi này :) https://bugs.eclipse.org/bugs/show_bug.cgi?id=361722 – twindham

1

Trước khi tôi tìm thấy câu trả lời đó được ghi chép lại đây và được chấp nhận, tôi đã cố gắng và thất bại trong việc giải quyết vấn đề này theo các cách sau:

tôi đã cố gắng đưa các tính năng trong định nghĩa sản phẩm. Tính năng này được cài đặt thành công, nhưng nó lấy đi khả năng của tôi để nó cập nhật độc lập với các tính năng khác trong ứng dụng RCP.

Tôi có lệnh p2 touchpoint hiện đang hoạt động. Nó thêm một kho lưu trữ vào các trang web cập nhật có sẵn trong ứng dụng RCP bằng cách sử dụng tệp p2.inf. Nó trông như thế này ...

instructions.configure=\ 
org.eclipse.equinox.p2.touchpoint.eclipse.addRepository(location:http${#58}//myUpdateSsite/myFeature,type:0,name:My Feature Name,enabled:true);\ 
org.eclipse.equinox.p2.touchpoint.eclipse.addRepository(location:http${#58}//myUpdateSsite/myFeature,type:1,name:My Feature Name,enabled:true);\\ 

Tôi đã cố gắng để thêm một dòng như thế này để có được tính năng cài đặt, nhưng Tycho build của tôi không khi tôi chạy mvn clean install

instructions.configure=\ 
org.eclipse.equinox.p2.touchpoint.eclipse.installFeature(feature:My Feature Name,featureId:com.my.domain.my.feature.id,version:1.0.0); 

Dưới đây là một số của thông báo lỗi từ maven/Tycho

An error occurred while configuring the installed items session context was: 
(profile=DefaultProfile, phase=org.eclipse.equinox.internal.p2.engine.phases.Configure, operand=null --> 
[R]{my.domain.my.rcp.product.plugin 1.1.6.20120427-1346}, 
action=org.eclipse.equinox.internal.p2.touchpoint.eclipse.actions.InstallFeatureAction). 
Installable unit contains no artifacts: [R]my.domain.my.rcp.product.plugin 1.1.6.20120427-1346. 

trực giác của tôi nói với tôi rằng thông báo lỗi này được nói rằng Plugin ứng dụng RCP của tôi là thiếu cái gì đó sẽ nói p2 nơi để tìm thấy những tính năng mà tôi wa nt để cài đặt tại thời gian xây dựng. Tôi nghĩ???

+0

Nỗ lực tốt! Tuy nhiên, điểm tiếp xúc 'installFeature' không thể hoạt động ở đây. Điểm tiếp xúc là lớp vật lý (tức là tệp I/O) của p2. Bạn cần thay đổi siêu dữ liệu p2 cấp cao của quá trình cài đặt để đạt được mục tiêu của mình. – oberlies

+0

Vâng, tôi đồng ý rằng các ví dụ trên không hoạt động. Tôi để chúng ở đây để những người khác đấu tranh với cùng một thứ có thể tìm thấy nó trong khi tìm kiếm trên web. Tôi thực sự muốn tìm hiểu thêm về những gì p2 đang làm ở đây. Thật khó để tìm ra cách làm việc với p2 kể từ IMHO, nó không trực quan lắm. Tôi muốn tìm hiểu thêm ... vì vậy, ý của bạn là gì "Bạn cần thay đổi trong siêu dữ liệu p2 cấp cao của quá trình cài đặt"? OBTW, câu trả lời mà Paul Webster cho tôi đang làm việc cho tôi, do đó, tôi đã không theo đuổi các giải pháp khả thi khác gần đây. – twindham

+0

Đã thêm một số giải thích khác trong nhận xét cho [giải pháp làm việc] (http://stackoverflow.com/a/10608982/1523648). – oberlies

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