12

我有以下情况。我需要能够运行由不同批处理文件启动的两个程序,其中每个批处理文件都使用同一个 jar 中的 main() 调用一个 java 类。我希望每个程序都有自己的日志。但是,第二个程序是第一个程序的安装程序,因此,我不想/不能轻易指定 -Dlogback.configurationFile=/path/to/config 文件,因为该位置可能尚不存在。

Logback 文档似乎提供了一个解决方案,但我需要一个如何使其工作的示例:

将默认配置文件的位置指定为系统属性

如果您愿意,可以使用名为 logback.configurationFile 的系统属性指定默认配置文件的位置。此属性的值可以是 URL、类路径上的资源或应用程序外部文件的路径。

java -Dlogback.configurationFile=/path/to/config.xml chapters.configuration.MyApp1

谁能指出一个示例,其中 logback.configurationFile 被定义为类路径上的资源而不是文件系统?

4

4 回答 4

14

您可以简单地将 amy-logback.xml放在您的一个类路径条目的根目录中并指定-Dlogback.configurationFile=my-logback.xml. 在内部,它可能会用于ClassLoader#getResource(String name)获取文件 - 检查此方法的 JavaDoc 以获取更多信息。

于 2012-10-25T14:21:58.023 回答
3

这个问题的答案在提供的链接中: https ://logback.qos.ch/manual/configuration.html#configFileProperty ,示例如下:

要包含的内容可以作为文件、资源或 URL 引用。

As a file:
To include a file use the file attribute. You can use relative paths but note that the current directory is defined by the application and is not necessarily related to the path of the configuration file.

As a resource:
To include a resource, i.e a file found on the class path, use the resource attribute.

<include resource="includedConfig.xml"/>

As a URL:
To include the contents of a URL use the url attribute.

<include url="http://some.host.com/includedConfig.xml"/>
于 2018-02-08T12:03:52.663 回答
1

好的,我继续尝试了。

如果 logback 配置文件是 jar 的本地文件(在您正在运行的同一个 jar 中),则此方法有效:

System.setProperty("logback.configurationFile", "org/package/path/your.logback.xml");

作品。如果它在“任何地方”的类路径中。这真的很奇怪,因为通常调用getResource您必须使用前面的斜杠指定它,例如:

YourClass.class.getResource("/org/package/path/your.logback.xml")所以不知道为什么。

其他更奇特的资源路径(例如指定确切的 jar)似乎也不起作用。诡异的。

于 2019-12-18T18:05:10.780 回答
1

我有一个与提供命令行参数略有不同的解决方案。

我的项目是这样设置的:

| foo
  - src
    - conf
      - logback.xml
    - main
    - test

我想要logback.xml罐子的外面,因为我有scanPeriod现场重新加载的装置。我想既然它应该在类路径中被拾取,我会将路径添加到manifest.mf它,它会自动被拾取。


foo的相关部分pom.xml如下所示:

<plugins>
  . . . Some plugins before
  <plugin>
    <artifactId>maven-resources-plugin</artifactId>
    <version>3.0.2</version>
    <executions>
      <execution>
        <id>copy-resources</id>
        <phase>validate</phase>
        <goals>
          <goal>copy-resources</goal>
        </goals>
        <configuration>
          <outputDirectory>${basedir}/target/conf</outputDirectory>
          <resources>
            <resource>
              <directory>src/conf</directory>
            </resource>
          </resources>
        </configuration>
      </execution>
    </executions>
  </plugin>

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.0.2</version>
    <configuration>
      <archive>
        <manifest>
          <addClasspath>true</addClasspath>
          <classpathPrefix>lib/</classpathPrefix>
          <mainClass>com.company.foo.main.Main</mainClass>
        </manifest>
        <manifestEntries>
          <version>${project.version}</version>
          <Class-Path>.</Class-Path>
          <Class-Path>conf/</Class-Path>
        </manifestEntries>
      </archive>
    </configuration>
  </plugin>
  . . . Some plugins after
</plugins>

需要注意的重要事项:

  • Maven 资源插件
    • 将所有文件复制src/conf到标准编译文件夹target/conf中。
  • Maven Jar 插件
    • conf文件夹添加到MANIFEST.MF的类路径中,这样您就无需在命令行上指定位置。
    • 文件夹中的所有文件conf都将添加到类路径中,而不仅仅是logback.xml

为了让 jar 在这种情况下运行,该conf文件夹必须放在 jar 旁边。它看起来像这样:

path/to/jar
  | foo.jar
  | lib/
  | conf/
    | logback.xml

MANIFEST.MF看起来像这样:

Manifest-Version: 1.0
Built-By: $user
Class-Path: lib/x.jar lib/y.jar lib/z.jar conf/
version: 0.0.1-SNAPSHOT
Created-By: Apache Maven 3.5.2
Build-Jdk: 1.8.0_161
Main-Class: com.company.foo.main.Main
于 2018-03-13T15:25:53.857 回答