我的项目 com.samedhi / base 有 logback.xml 文件,项目 com.samedhi / derive 也有 logback.xml 文件。项目“派生”依赖于“基础”。当我在“派生”上“lein trampoline repl
”时,我收到以下警告。
....
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
....
所以,问题似乎是我的classpath中有两个logback.xml。当我从' derive '项目中获取repl时,我应该做什么来“压缩”来自项目' base '的logback.xml?
答案 0 :(得分:19)
就我而言,你永远不应该在JAR文件中打包一个日志配置文件(logback.xml,log4j.properties或者你有什么)。甚至拥有日志配置文件的重点是让最终用户通过编辑文件来调整日志记录级别。将其隐藏在存档中会使其失败,因为要更改日志记录级别,用户必须扩展存档,编辑文件,然后重新打包存档。
这是我部署的应用程序的首选布局。设置起来要多做一些工作,但IMO值得一试,因为它为您提供了uberjar所没有的灵活性和易配置性。
my-app/
bin/
run-app.sh
config/
logback.xml
lib/
my-lib.jar
my-app.jar
您的run-app.sh
脚本看起来像:
BIN=`dirname "$0"`
BASE=$BIN/..
java -cp "$BASE/config:$BASE/lib/*" my-app.main
这样做的好处是,通过将config目录放在类路径的前面,找到的任何日志配置文件都应该优先于其中一个JAR中可能找到的任何内容(例如,包含在第三方库中)你无法控制的。)
答案 1 :(得分:4)
如果 base 是一个库,它不应该带有logback.xml。为什么图书馆关注伐木?如果它是一个应用程序,你应该将公共部分提取到一个库 - base-common - 和一个小应用程序 - base-app 。然后 base-common 不包含任何回溯配置。 base-app 和 derive 都依赖于 base-common 。他们可以指定他们的logback配置而不会发生冲突。
答案 2 :(得分:1)
我想回答我自己的问题,因为我特别在Clojure的背景下提问(虽然我完全没有提到原始问题,天才)。
我通过执行Alex(接受的答案)建议并将我的logback.xml放在其自己的特殊目录dev-config
中来解决问题。然后我使用clojure的project.clj
文件来指定只应在运行开发配置文件时加载dev-config
,如下所示:
;; 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"]})
唯一重要的一点是:profiles => :dev => :source-paths 已将“dev-config”添加到其向量中。我在进行本地开发时会选择此目录,但不是创建的jar文件的一部分,因此不会在导入此项目的其他项目中显示。因此,在对此项目进行开发时会显示日志记录,但在其他项目使用此项目时不会显示。优异。
答案 3 :(得分:1)
我发现亚历克斯的战略是有效的。我想添加一个小提示:您可以创建一个common-config项目,其中包含可编辑的通用配置文件(例如logback.xml等)。将生成的工件作为依赖项添加到所有项目中项目,范围提供。
这将允许您在编译/测试时使用logback.xml(来自Eclipse或任何IDE),但将从可用于继承的依赖项中排除common-config jar。在运行时,您将提供正确的文件(取决于dev / test / prod环境),如Alex所示。
答案 4 :(得分:0)
就我而言,我修改了斯蒂芬的答案,所以project.clj
看起来像这样:
:profiles {:dev {:resource-paths ["test/resources"]}} ; appended to default
,新目录test/resources
包含用于测试库的logback.xml
,但不会传播给lib用户。
请注意,根据注释,将"test/resources"
附加到默认值:resources-paths
上以创建最终值["resources" "test/resources"]