Tôi đang làm việc với cơ sở mã L ++ LARGE cũ với nhiều tệp IDL có tất cả các loại và hằng số được khai báo bên ngoài bất kỳ mô-đun nào.Tạo java từ IDL (tránh gói mặc định)
Đối với C++, kết quả này trong mã được tạo ra cho không gian tên chung - xấu xí, nhưng có thể chấp nhận được.
Bây giờ tôi đang cố gắng thêm các máy khách Java để kết nối qua CORBA. Đối với Java, tuy nhiên, các kiểu được tạo ra từ IDL (sử dụng trình biên dịch IDL của Sun/Oracle cho java: idlj) nằm trong gói mặc định java vì chúng không nằm trong mô-đun IDL. Điều này dẫn đến lỗi biên dịch Java, vì nó là bất hợp pháp để nhập từ gói mặc định.
Tôi đang tìm cách dễ nhất để khắc phục sự cố.
tôi đã xem xét những điều sau đây:
- Đặt một tuyên bố mô-đun xung quanh tất cả các loại. Tôi hiện đang làm việc giải pháp này, nhưng nó VERY đau đớn, dựa trên số lượng các loại bị ảnh hưởng và tác động đến lớn di sản C++ codebase.
- Sử dụng tùy chọn -pkgPrefix hoặc -pkgTranslate. Cho đến nay, tôi không thể tìm ra cách thực hiện điều này một cách tổng quát, vì bạn phải chỉ định mô-đun để dịch từ hoặc chỉ định loại để thêm tiền tố đến. -pkgPrefix có thể được sử dụng cho một loại cụ thể, nhưng chúng tôi có hàng trăm loại và tôi không muốn liệt kê một tùy chọn -pkgPrefix cụ thể cho từng tệp được biên dịch ...
- Sử dụng chỉ thị pragma? Tôi không biết một người sử dụng, nhưng hy vọng một guru có thể chỉ đường?
- ????
Tôi cảm thấy khó tin rằng không có cách nào dễ dàng để buộc IDL nằm trong gói Java nếu không có mô-đun hiện có chứa tất cả các loại. Tôi hy vọng rằng tôi chỉ thiếu những điều hiển nhiên!
Sửa:
- IDL-to-Java biên dịch là idlj.
- Đã thêm ví dụ bên dưới.
- Cập nhật Item # 2 (trên) để làm rõ rằng việc sử dụng -pkgPrefix đối với từng loại là không khả thi
Ví dụ (trừ khi nó có thể được kịch bản hợp lý?):
Foo.idl
struct Foo
{
.
.
.
}
Foo.java: (lưu ý rằng không có gói được quy định, có nghĩa là gói mặc định):
public final class Foo implements org.omg.CORBA.portable.IDLEntity
{
.
.
.
}
ClassUsesFoo.java:
package com.sigh;
import Foo; // <-- this is an error
public class ClassUsesFoo
{
private Foo f;
};
Hỏi: Bạn đang sử dụng công cụ nào để tạo Java từ IDL? Tiêu chuẩn Sun "idlj"? Bạn có thể đưa ra một ví dụ cụ thể về 1) dòng lệnh của bạn (với "-pkgPrefix") và 2) kết quả Java (không hoạt động)? – paulsm4