2011-12-12 40 views
6

tôi đã cố gắng để tìm kiếm một giải pháp cho điều này, nhưng đã không có niềm vui: Trong Intellij IDEA tôi đã thiết lập một tập hợp các module vì vậy mà tôi có như sau:Intellij biên tập IDEA: trật tự classpath

  • dự án Web của tôi (tất cả các mô-đun phụ thuộc thiết lập để 'Runtime')
  • My Web dự án phụ thuộC# 1 (+ artifact bản JAR để MWp của/WEB-INF/lib)
  • My Web dự án phụ thuộC# 2 (+ tạo tác sao chép JAR sang MWP/WEB-INF/lib)

Phụ thuộC# 1 có một lớp org.acme.foo, nhưng do đó, MWP và định nghĩa khác nhau (oh joy). Nó xây dựng ok - tất cả các mã trong MWP xây dựng chính xác với các lớp trong MWP thay vì Dependency # 1.

Nhưng ... trong trình soạn thảo của nó, Intellij đang đưa cho tôi squiggle màu đỏ vì nó thích tham chiếu lớp trong Phụ thuộc số 1 với định nghĩa không tương thích của nó.

Bỏ qua thực tế là không thực sự có sự xung đột lớp/gói này, bất kỳ ai có thể giúp tôi đẩy Intellij vào lớp học trong mô-đun cục bộ chứ không phải ở lớp phụ thuộc không?

EDIT: Tôi đang sử dụng mới nhất Intellij 11.

EDIT: cho bất cứ ai tìm kiếm câu hỏi này, những rắc rối ra đi trong Intellij 12 +

Trả lời

8

tôi đã phải đối mặt với cùng một vấn đề trong IntelliJ 11 (Mac OS X phiên bản).

Tôi đã chỉnh sửa thủ công tệp .iml của dự án và sắp xếp lại các phụ thuộc theo đúng thứ tự: tôi đặt phần tử orderEntry chứa phiên bản đúng của tệp .jar ở trên cùng.

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

+0

Cảm ơn - Tôi chỉ mới quay trở lại điều này, sau khi từ bỏ Intellij và quay lại với Eclipse: áp lực thời hạn. Cố gắng một lần nữa trong tuần này với cùng một dự án và thấy rằng vấn đề đã biến mất trong Leda EAP. Đặt hàng các phụ thuộc đã hoạt động đúng lúc này. – tridian

0

Tôi có một vấn đề tương tự mà tôi đang cố gắng để làm việc suốt.

Tôi đã tìm thấy hai tình huống mà tôi biết điều này xảy ra và đã tìm thấy cách thức xung quanh một trong số chúng.

Kịch bản 1) Bạn lớp dùng để chỉ một lớp trên classpath thêm lên chuỗi hơn người ta cũng tìm thấy trong lọ, tuy nhiên trong báo cáo kết quả nhập khẩu báo cáo kết quả nhập khẩu có dạng

import com.company.classes.to.use.* 

By bulking chúng lên, IDE dường như nhận tất cả các lớp trong gói đó từ cùng một vị trí bình. Bằng cách tách chúng ra thành từng câu lệnh lớp nhập khẩu, IDE sẽ chọn chúng một cách riêng biệt.

Trường hợp 2) Bạn lớp phương thức chuỗi daisy cho lớp được ghi đè.

something.getSomethingElse().getAnotherThing().getYetAnotherThing(); 

nếu getSomethingElse() trả về một đối tượng không có trong lớp (vì vậy bạn không phải nhập nó) thì bạn vẫn gặp lỗi. (Thêm màu xám nhập khẩu dòng như nó nhận ra nó không được sử dụng vì vậy nó không giúp đỡ). Tôi sẽ không tha thứ cho phương pháp này.

chỉnh sửa: Rõ ràng thay thế cho điều này là cấu trúc lại mã để phá vỡ đường dây xuống

ObjectToImport obj = something.getSomethingElse(); 
result = obj.getAnotherThing.getYetAnotherThing(); 

Và sau đó nhập các biến temp ...

Rõ ràng đây không phải là lý tưởng, và bạn không nên refactoring mã của bạn vì lợi ích của IDE của bạn, nhưng cần phải, những dòng màu đỏ làm phiền địa ngục ra khỏi tôi.

Tôi hy vọng những trợ giúp này. Nếu bạn đã tìm được giải pháp tốt hơn, hãy chia sẻ!

Kính trọng, M

+2

Cảm ơn - Tôi chỉ mới quay lại điều này, sau khi từ bỏ Intellij và quay lại Eclipse: áp lực thời hạn. Cố gắng một lần nữa trong tuần này với cùng một dự án và thấy rằng vấn đề đã biến mất trong Leda EAP. Đặt hàng các phụ thuộc đã hoạt động đúng lúc này. – tridian

+0

Tôi nghĩ rằng bạn hiểu sai những gì nhập khẩu. Nó chỉ đơn giản là một thuật ngữ cú pháp, không có gì hơn. Nó không ảnh hưởng đến những gì JAR xuất hiện trên classpath hoặc bất cứ điều gì như thế. Nó chỉ giúp bạn tiết kiệm thời gian và làm cho mã của bạn dễ đọc hơn bằng cách cho phép bạn nhập 'ObjectToImport' thay vì' com.company.classes.to.use.ObjectToImport'. – Frans

+0

Cảm ơn Frans nhưng không. Những gì được đề cập không phải là những gì nhập khẩu, hoặc những gì java nào, đó là những gì Intellij đang làm. Tất nhiên điều này là nửa thập kỷ trước vì vậy tôi chắc chắn nó không phải chịu đựng điều này nữa. –

11

Tôi đã gặp vấn đề này và đã sử dụng câu trả lời của Vladimir đã làm việc (do đó upvote của tôi) nhưng tiếc là tôi thấy rằng tôi phải tiếp tục chỉnh sửa lại tập tin .iml vì nó liên tục được viết lại. Sau khi một số digging tôi thấy làm thế nào để thay đổi điều này vĩnh viễn:

Navigate to File -> Cấu trúc dự án -> Modules -> -> Dependencies tab

IntelliJ sẽ thêm sự phụ thuộc vào classpath theo thứ tự chúng được liệt kê ở đó . Để di chuyển chúng, chỉ cần đánh dấu sự phụ thuộc bạn muốn di chuyển và sử dụng mũi tên lên và xuống trên thanh công cụ ở dưới cùng.

+0

Vì vậy, đó sẽ là câu trả lời? – Rekin

+0

Nó hoạt động cho tôi :-) –

+0

Xin chào. Trở lại với eons này sau câu trả lời của bạn ...... cuộc sống vv ...... những gì bạn mô tả làm việc hoàn hảo trong Intellij 12+, nhưng không phải trong 11. – tridian

1

Trong trường hợp của tôi, nó hoạt động tốt trong Eclipse nhưng đã xảy ra trong IntelliJ. Lý do thực sự là công cụ libs tải/lọ tùy thuộc vào cơ chế khác nhau:

  • Eclipse: file classpath
  • IntelliJ: * file .iml

tôi có một loạt các libs/lọ là trong một thư mục. Thư mục được bao gồm trong tệp * .iml như thế này <orderEntry type="library" name="external-libs" level="project" /> Có 2 libs/jars có xung đột (cả hai đều chứa "org.joda.time.DateTime" trong trường hợp của tôi). Nhưng 2 DateTimes có các chức năng khác nhau. Tôi phải chỉ định một trong số họ nên được tải trước khi khác.

Giải pháp:

  1. Đến "File-> Dự án Structure-> Dependencies"
  2. Nhấn vào nút "+" ở phía dưới để bao gồm các lib/jar Tôi muốn tải đầu tiên.
  3. Sử dụng các nút lên/xuống để di chuyển lib/jar vừa được đưa vào phía trên thư mục/jars/libs xung đột.
  4. Xây dựng lại dự án.

Xem ảnh chụp màn hình. joda-time-2.4.jar được thêm vào bên ngoài libs bên ngoài để kiểm soát chuỗi tải. joda-time-2.4.jar is added before external-libs to be loaded first.

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