2013-08-15 24 views
17

Tôi có dự án com.samedhi/cơ sở mà có một logback.xml file và dự án com.samedhi/lấy rằng cũng có một logback.xml tập tin. Dự án 'xuất phát' có sự phụ thuộc vào 'cơ sở'. Khi tôi "lein trampoline repl" trên 'xuất phát', tôi nhận được cảnh báo sau.làm cách nào để chặn một tệp logback.xml dự án kế thừa (2 logback.xml trong một dự án)?

.... 
15:34:30,066 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy] 
15:34:30,066 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml] 
15:34:30,066 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/home/stephen/Work/com.samedhi/derive/client/config/logback.xml] 
15:34:30,067 |-WARN in ch.qos.logback.classic.LoggerContext[default] - Resource [logback.xml] occurs multiple times on the classpath. 
15:34:30,067 |-WARN in ch.qos.logback.classic.LoggerContext[default] - Resource [logback.xml] occurs at [jar:file:/home/stephen/.m2/repository/com/samedhi/base.app/0.0.1-SNAPSHOT/base.app-0.0.1-SNAPSHOT.jar!/logback.xml] 
15:34:30,067 |-WARN in ch.qos.logback.classic.LoggerContext[default] - Resource [logback.xml] occurs at [file:/home/stephen/Work/com.samedhi/derive/client/config/logback.xml] 
15:34:30,129 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set 
.... 

Vì vậy, vấn đề dường như là tôi có hai logback.xml trong đường dẫn lớp của mình. Tôi phải làm gì để "surpress" logback.xml từ dự án 'base' khi tôi thay thế từ dự án 'derive'?

+0

Trong trường hợp của tôi, tôi muốn tạo một thư viện ghi nhật ký chung mà nhóm của tôi sử dụng trong tất cả các dự án vì vậy tôi muốn logback.xml của mình được chôn trong phụ thuộc khai thác gỗ của chúng tôi. – Catfish

Trả lời

16

Theo như tôi quan tâm, bạn không bao giờ nên gói một tệp cấu hình ghi nhật ký (logback.xml, log4j.properties hoặc những gì có bạn) bên trong tệp JAR. Toàn bộ điểm thậm chí có tệp cấu hình ghi nhật ký là giúp người dùng cuối dễ dàng điều chỉnh mức ghi bằng cách chỉnh sửa tệp. B chôn nó trong một kho lưu trữ đánh bại mục đích của điều đó, bởi vì để thay đổi mức độ đăng nhập người dùng của bạn phải mở rộng kho lưu trữ, chỉnh sửa tệp và sau đó đóng gói lại bản lưu trữ.

Đây là bố cục ưa thích của tôi cho một ứng dụng được triển khai. Đó là một chút công việc để thiết lập, nhưng IMO là giá trị rắc rối bởi vì nó cung cấp cho bạn sự linh hoạt và dễ cấu hình mà một uberjar không.

my-app/ 
    bin/ 
    run-app.sh 
    config/ 
    logback.xml 
    lib/ 
    my-lib.jar 
    my-app.jar 

run-app.sh Kịch bản của bạn sẽ giống như thế:

BIN=`dirname "$0"` 
BASE=$BIN/.. 
java -cp "$BASE/config:$BASE/lib/*" my-app.main 

này có ưu điểm là, bằng cách đặt thư mục config ở phía trước của classpath, bất kỳ tập tin đăng nhập cấu hình tìm thấy ở đó nên được ưu tiên hơn bất kỳ thứ gì có thể được tìm thấy trong một trong các JAR (ví dụ: thư viện của bên thứ ba mà bạn không có quyền kiểm soát).

+1

+1 cho đề xuất chung để không đóng gói tệp cấu hình ghi nhật ký trong một cái bình. Lần duy nhất mà chúng tôi thực hiện đóng gói tệp nhật ký là khi tạo một jar thực thi hoặc [phát hành webstart java] (http://stackoverflow.com/questions/25001350/how-do-i-specify-a-logback-configuration-for -use-in-a-java-webstart-application). Tuy nhiên, khi chúng ta sử dụng maven, chúng ta phải thực hiện 'mvn clean install' tiếp theo để loại bỏ jar với cấu hình đăng nhập từ kho lưu trữ cục bộ. – amaidment

4

Trong trường hợp cơ sở là thư viện, không nên có tệp logback.xml. Tại sao thư viện lại quan tâm đến việc đăng nhập? Trong trường hợp đó là một ứng dụng, bạn có thể trích xuất phần chung vào thư viện - cơ sở chung - và một ứng dụng nhỏ - base-app. Sau đó, cơ sở chung không chứa bất kỳ cấu hình đăng nhập nào. base-appxuất phát cả hai đều phụ thuộc vào base-common. Họ có thể chỉ định cấu hình đăng nhập của họ mà không xung đột.

1

Tôi muốn trả lời câu hỏi của riêng mình vì tôi đã yêu cầu cụ thể trong ngữ cảnh của Clojure (mặc dù tôi hoàn toàn không đề cập đến câu hỏi có nguồn gốc, thiên tài).

Tôi đã khắc phục sự cố bằng cách thực hiện như Alex (chấp nhận câu trả lời) đề xuất và đặt logback.xml vào thư mục đặc biệt của riêng mình dev-config.sau đó tôi sử dụng tập tin clojure của project.clj để xác định rằng dev-config chỉ nên được nạp khi hồ sơ cá nhân phát triển được điều hành như sau:

;; project.clj 
(defproject com.samedhi/base.app "0.0.1-SNAPSHOT" 
    :dependencies [[org.clojure/clojure "1.5.1"]] 
    :profiles {:dev {:source-paths ["dev", "dev-config"]}} 
    :min-lein-version "2.0.0" 
    :source-paths ["app/src" "app/templates"] 
    :resource-paths ["config"] 
    :target-path "out/" 
    :compiler-options {:externs ["app/externs/base.js"]} 
    :aliases {"dumbrepl" ["trampoline" "run" "-m" "clojure.main/main"]}) 

Các chỉ điểm quan trọng là : cấu hình =>: dev =>: nguồn đường đã có "dev-config" được thêm vào vectơ của nó. Thư mục này được chọn khi tôi đang phát triển cục bộ, nhưng không phải là một phần của các tệp jar đã tạo và do đó không hiển thị trong các dự án khác nhập dự án này. Vì vậy, việc ghi nhật ký hiển thị khi thực hiện phát triển dự án này, nhưng không hiển thị khi dự án này được các dự án khác sử dụng. Xuất sắc.

0

Tôi thấy chiến lược Alex có hiệu quả. Tôi muốn thêm một gợi ý nhỏ: bạn có thể tạo một dự án cấu hình chung với các tệp cấu hình phổ biến có thể chỉnh sửa đặt bên trong (ví dụ: logback.xml v.v.) Thêm tạo phẩm kết quả dưới dạng phụ thuộc trong tất cả các dự án của bạn, với phạm vi được cung cấp.

Điều này sẽ cho phép bạn sử dụng logback.xml tại thời gian biên dịch/thử nghiệm (từ Eclipse hoặc bất kỳ IDE nào), nhưng sẽ loại trừ bình cấu hình chung khỏi các phụ thuộc có sẵn cho kế thừa. Khi chạy, bạn sẽ cung cấp tệp thích hợp (tùy thuộc vào môi trường dev/test/prod) như Alex hiển thị.