Maven kullanıyorsanız, genellikle log4j.properties dosyasını java veya kaynaklar altına mı koyarsınız?


128

Geleneksel Maven dizinlerini kullanırken log4j.properties dosyasını nereye koymalıyım?


6
src / test / resources - yapınızın tüketicisi, dağıtım için gereken günlük kaydı düzeylerini belirleyecektir. Ancak bunu ticari işler için yapıyorsanız slf4j'yi tavsiye ederim. Bu, dağıtım sırasında günlük çerçevelerini değiştirme seçeneği sunar. slf4j.org
David Victor

2
BTW, log4j'yi özellikler / xml yapılandırma dosyası olmadan kullanmayı denemek istiyorsanız. ' Logging.apache.org/log4j/1.2/manual.html - Configuration' 'dan "BasicConfigurator.configure yönteminin çağrılması oldukça basit bir log4j kurulumu oluşturur." Ayrıca bkz: logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/… maven.apache.org/plugins/maven-resources-plugin/examples/…
David Victor

Yanıtlar:


141

src/main/resources bunun için "standart yerleşim" dir.

Güncelleme: Yukarıdakiler soruyu yanıtlar, ancak bu en iyi çözüm değildir. Bu konudaki diğer cevaplara ve yorumlara bakın ... muhtemelen jar ile kendi günlük kaydı özelliklerinizi göndermezsiniz, bunun yerine istenen günlüğü yapılandırmak için istemciye (örneğin uygulama-sunucu, sahne ortamı vb.) Bırakırsınız. Bu yüzden onu koymak src/test/resourcesbenim tercih ettiğim çözümdür.

Not: Somut günlük yapılandırmasını istemciye / kullanıcıya bırakmaktan bahsetmişken, değiştirmeyi düşünmelisinizlog4jslf4j uygulamanızda ile .


Oluşturulacak hiçbir kaynak bulamadım. Bunu manuel olarak yapmam gerekir mi?
user496949

3
Evet. El ile oluşturmak resourcesve log4j.propertiescevapta belirtildiği klasörde.
Nishant

@ user496949: altındaki dosyalar src/main/resourcesvarsayılan olarak kopyalanacaktarget/classes
sıçrama

17
Log4j ayarlarınızı yapınızın bir parçası olarak dışa aktarmayı düşünmüyorsanız - onu src / test / kaynaklar altına koymak çok daha iyidir
David Victor

1
@FerasOdeh, onu oluşturulan yapay nesnelerden (kavanozlar, savaşlar vb.) Hariç tutmak ve yalnızca "log4j ayarlarınızı yapınızın bir parçası olarak dışa aktarmayı planlamadığınız sürece" test sırasında kullanılmalıdır.
Ali Shakiba

60

Sadece yerleştirmek onu src/main/resourcesyapının içine yerleştirir. Örneğin, yapınız bir JAR ise, log4j.propertiesgünlük kaydını yapılandırılabilir hale getirmenin başlangıç ​​noktasını kaybederek dosyanın içinde olacaktır .

Genellikle onu yerleştiririm src/main/resourcesve şu şekilde hedefe çıkacak şekilde ayarlarım:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <targetPath>${project.build.directory}</targetPath>
            <includes>
                <include>log4j.properties</include>
            </includes>
        </resource>
    </resources>
</build>

Ek olarak, log4j'nin gerçekten görmesi için, çıktı dizinini sınıf yoluna eklemeniz gerekir. Yapıtınız yürütülebilir bir JAR ise, onu oluşturmak için muhtemelen maven-assembly-eklentisini kullandınız. Bu eklentinin içinde, aşağıdaki Class-Pathgibi bir bildirim girişi ekleyerek JAR'ın geçerli klasörünü sınıf yoluna ekleyebilirsiniz :

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <mainClass>com.your-package.Main</mainClass>
            </manifest>
            <manifestEntries>
                <Class-Path>.</Class-Path>
            </manifestEntries>
        </archive>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id> <!-- this is used for inheritance merges -->
            <phase>package</phase> <!-- bind to the packaging phase -->
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Artık log4j.properties dosyası JAR dosyanızın hemen yanında bağımsız olarak yapılandırılabilir olacaktır.

Eclipse doğrudan uygulamayı çalıştırmak için, eklemek resourceskoşunuz yapılandırmasında Sınıfyolu dizini: Run->Run Configurations...->Java Application->Newseçmek Classpathsekmesini seçin Advancedve gidin src/resourcesdizine.


2
başka bir seçenek de, paketlenmemesi için src / test / kaynaklar altına koymak olabilir.
rogerdpack

Vay. Bunun için teşekkürler. Bu tam da ihtiyacım olan şeydi!
blissfool

@ Zoltán, önerdiğiniz gibi çıktı dizinini sınıf yoluna eklemekte zorlanıyorum. Belirli bir projenin .classpath dosyasına gitmek ve bu log4j çıktı dizinini buraya eklemek gibi manuel olarak yapabileceğim bir yol var mı, böylece log4j, uygulama bir .war dosyasına paketlendikten sonra .properties dosyasını görebilir. Ayrıca targetPath etiketi, değer olduğu gibi mi kullanılmalı ${project.build.directory}yoksa projenin yerel sürücümde yaşadığı gerçek yola göre mi düzenlenmelidir?
Ireti

26

Bazı "veri madenciliği" bunu açıklıyor src/main/resources tipik yer burasıdır.

Üzerinde Sonuçlar Google Code Search :

  • src/main/resources/log4j.properties: 4877
  • src/main/java/log4j.properties: 215

4
Bu yanıtın 20 dakika önce yanıtlanandan herhangi bir açıdan farkı nedir? Ayrıca, doğru hatırlıyorsam resourcesdeğil resource.
Nishant

6
@Nishant: farklı değil çünkü cevap kutusunu açtığımda bilgisayardan ayrıldım. Geri dönüp soruyu cevapladıktan sonra sorunun zaten cevaplanmış olduğunu kaçırdım. resourcesadece bir yazım hatasıydı.
sıçrama

1
Maven, maven derleyici eklentisi, maven projelerinin düzeni için bazı kurallar okumayı öneririm. Belki eseriniz inşa edildiğinde 'hedef' altında neyin nereye gittiğine bakın. O zaman belki cevabınızı değiştirebilirsiniz.
David Victor

4
Doğru cevap src / xxx / kaynaklar'dır - bu bir kural değildir. Bakınız: maven.apache.org/plugins/maven-resources-plugin/examples/… - burada 'xxx' 'ana' veya 'test' olabilir. Önceden yapılandırılmış günlük kaydı seviyeleri sağlamak istemediğiniz sürece, günlük kaydını test için gerektiği gibi - 'src / test / kaynaklar' aracılığıyla - yapılandırmak ve yapınızın tüketicisinin günlük kaydı seviyesini ayarlamasına izin vermek daha akıllıca olacaktır.
David Victor

22
"Jump off a bridge" için Google sonuçları: 18.200.000. "Bir köprüden atlamayın" için Google sonuçları: 137.000
djjeck

9

Projeyi başlatmak için kullanılan kaynaklar tercihen src / main / resources klasörüne yerleştirilir. Derleme sırasında bu kaynakların yüklenmesini etkinleştirmek için, bir derleme kaynağı olarak maven projesindeki pom.xml'ye girişler ekleyebilirsiniz.

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering> 
        </resource>
    </resources>
</build> 

Diğer .properties dosyaları da başlatma için kullanılan bu klasörde tutulabilir. Eğer kaynak dosyaları klasör özelliklerinde bazı değişkenler var ve olarak ayarlanır src / main / filtrelerinde tutulur profil filtreleri özellikleri dosyaları, onları doldurmak istiyorsanız Filtreleme gerçek ayarlanır profilleri ama tamamen farklı bir kullanım durumu . Şimdilik onları görmezden gelebilirsiniz.

Bu harika bir kaynak maven kaynak eklentisidir , kullanışlıdır, sadece diğer bölümlere de göz atın.


Yukarıdaki maven snippet'ini kopyalayıp yapıştırırsanız, lütfen unutmayın </resources> </build>
rdesilva

6

Kaynak dosyalarını başka bir konuma koymak, kullanabileceğiniz en iyi çözüm değildir:

<build>
  <resources>
    <resource>
      <directory>src/main/java</directory>
      <excludes>
        <exclude>**/*.java</exclude>
      </excludes>
    </resource>
  </resources>
<build>

Örneğin, kaynak dosyaları (örn. Jaxb.properties), Java sınıflarıyla birlikte paketlerin derinliklerine girdiğinde.


1

Log4j.properties veya log4j.xml dosyanız src / main / resources altında bulunamazsa, bu PropertyConfigurator.configure ("log4j.xml") kullanın;

   PropertyConfigurator.configure("log4j.xml");
   Logger logger = LoggerFactory.getLogger(MyClass.class);
   logger.error(message);

0

Aşağıdaki kodu, pom.xml dosyanızdaki kaynak etiketlerinden derleme etiketlerinin içine ekleyin. bu, kaynak etiketlerinin pom.xml dosyanızdaki derleme etiketlerinin içinde olması gerektiği anlamına gelir

<build>
    <resources>
        <resource>
            <directory>src/main/java/resources</directory>
                <filtering>true</filtering> 
         </resource>
     </resources>
<build/>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.