2009-08-05 25 views
7

Có ai biết cách lập trình đường dẫn tuyệt đối trong hệ thống tệp cho một EAR được triển khai trong JBoss, từ mã Java trong cùng một EAR đó không?Cách lấy vị trí EAR hiện tại theo lập trình với JBoss

Tôi cần điều này vì tôi muốn sao chép một số tệp nằm bên trong EAR sang một phần khác của hệ thống tệp, vào thời gian triển khai.

Cảm ơn tất cả mọi người!

Trả lời

3

Tôi làm theo cách này.
EAR có MyService dịch vụ, nơi tôi làm việc với nội dung EAR:

import org.jboss.system.ServiceControllerMBean; 
import org.jboss.system.ServiceMBeanSupport; 

public class MyService extends ServiceMBeanSupport { 

    public void workWithEar() 
    { 
     ServiceControllerMBean serviceController = (ServiceControllerMBean) MBeanProxy.get(
        ServiceControllerMBean.class, 
        ServiceControllerMBean.OBJECT_NAME, server); 
     // server is ServiceMBeanSupport member 

     ClassLoader cl = serviceController.getClass().getClassLoader(); 

     String path = cl.getResource("META-INF/jboss-service.xml").getPath() 
     InputStream file = cl.getResourceAsStream("META-INF/jboss-service.xml"); 
    } 
} 
+0

Tôi có thể sử dụng một cách đơn giản hơn, vì lớp mà tôi cần đường dẫn đó, tôi nằm trong EAR chứa WAR chứa các tệp mà tôi muốn sao chép. Vì vậy, tôi chỉ cần 1 dòng mã: String path = this.getClass(). GetClassLoader(). GetResource ("my_war_filename.war"). GetPath(); Cảm ơn! – ptdev

2

Điều này khá khó sử dụng, nhưng bạn có thể thực hiện điều này bằng cách truy vấn JBoss MainDeployer MBean. MBean được tìm thấy tại jboss.system:service=MainDeployer và có hoạt động JMX listDeployments. Điều này trả về một bộ sưu tập gồm DeploymentInfo đối tượng, một trong số đó sẽ là triển khai EAR của bạn. DeploymentInfo đó có thuộc tính url là URL file:// mô tả thư mục triển khai của bạn.

Nice, eh? Bạn có thể sử dụng API JMX thô để làm điều này, nhưng Spring cung cấp một cơ chế đẹp hơn nhiều, sử dụng MBeanProxyFactoryBean để hiển thị một cá thể của MainDeployerMBean.

Tôi muốn tìm một cách đơn giản hơn, nhưng đó là cách tốt nhất tôi đã tìm thấy từ trước tới nay.

+0

Cảm ơn sự giúp đỡ của bạn! Tuy nhiên, nó không hoạt động trong trường hợp của tôi: Tôi đang sử dụng SeamFramework cùng với JBoss và tôi cần mã này để chạy từ một phương thức được chú thích là @Observer ("org.jboss.seam.postInitialization"), được gọi là khi ứng dụng Seam bắt đầu. Tại thời điểm này tôi sẽ nhận được một MainDeployerMBean báo cáo: 0 triển khai EARs, 0 không đầy đủ và 0 chờ đợi để triển khai ... – ptdev

1

Các tài nguyên này được lập bản đồ hoặc cung cấp theo đường dẫn web (trong WAR)?

Nếu có, bạn có thể thử sử dụng ServletContext.getRealPath() để dịch đường dẫn ảo sang đường dẫn hệ thống/tệp thực.

+0

Cảm ơn sự giúp đỡ của bạn! Nó không làm việc trong trường hợp của tôi tuy nhiên: Như tôi đã nói trong một bình luận khác, tôi đang sử dụng này trong Seam khởi động. Tôi không thể tìm thấy một cách để có được một ServletContext tại thời điểm này (nó sẽ trở về như null). – ptdev

3

Để có được ServletContext từ Seam, bạn có thể làm:

ServletLifecycle.getCurrentServletContext() 

trong đó có sẵn trong thời gian sớm Seam đã tạo ra applicationContext. Và sau đó getRealPath("/") hoạt động tốt cho thư mục triển khai ngữ cảnh gốc. Bất kỳ cấu trúc thư mục nào trong thư mục gốc đều có thể đạt được.

3

bạn có thể làm bạn "System.getProperty()" ở đây là link cho khác các thuộc tính bạn có thể sử dụng

ví dụ:

String jBossPath = System.getProperty("jboss.server.base.dir") 

kết quả

"/Users/ALL_THE_PATH/JBoss_7-1/standelone" 

Sau khi bạn chỉ cần phải thêm "/deployments/YOUR_PROJECT_EAR/..."

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