ถ้าใช้ maven โดยปกติคุณจะใส่ log4j.properties ไว้ใต้ java หรือ resources?


128

ฉันควรวางไฟล์ log4j.properties ไว้ที่ไหนเมื่อใช้ไดเร็กทอรี Maven แบบเดิม


6
src / test / resources - ผู้ใช้อาร์ติแฟกต์ของคุณจะกำหนดระดับการบันทึกที่จำเป็นสำหรับการปรับใช้ อย่างไรก็ตามฉันอยากจะแนะนำ slf4j หากคุณทำสิ่งนี้เพื่องานเชิงพาณิชย์ สิ่งนี้ให้ตัวเลือกในการสลับกรอบการบันทึกในการปรับใช้ slf4j.org
David Victor

2
BTW หากคุณต้องการทดลองความเป็นไปได้ในการใช้ log4j โดยไม่มีไฟล์ config properties / xml จาก " logging.apache.org/log4j/1.2/manual.html - Configuration" "การเรียกใช้เมธอด BasicConfigurator.configure จะสร้างการตั้งค่า log4j ที่ค่อนข้างเรียบง่าย" ยังเห็น: logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/... maven.apache.org/plugins/maven-resources-plugin/examples/...
เดวิดวิคเตอร์

คำตอบ:


141

src/main/resources คือ "ตำแหน่งมาตรฐาน" สำหรับสิ่งนี้

อัปเดต:ข้างต้นตอบคำถาม แต่ไม่ใช่วิธีแก้ปัญหาที่ดีที่สุด ตรวจสอบคำตอบอื่น ๆ และความคิดเห็นเกี่ยวกับเรื่องนี้ ... คุณอาจจะไม่ส่งคุณสมบัติการบันทึกของคุณเองด้วย jar แต่ปล่อยให้ไคลเอนต์แทน (เช่นแอพเซิร์ฟเวอร์สภาพแวดล้อมของพื้นที่งาน ฯลฯ ) เพื่อกำหนดค่าการบันทึกที่ต้องการ ดังนั้นการใส่เข้าไปจึงsrc/test/resourcesเป็นทางออกที่ฉันต้องการ

หมายเหตุ: เมื่อพูดถึงการออกจากการกำหนดค่าบันทึกที่เป็นรูปธรรมให้กับลูกค้า / ผู้ใช้คุณควรพิจารณาแทนที่log4jด้วยslf4jในแอปของคุณ


ฉันไม่พบว่ามีการสร้างทรัพยากรที่น่ากลัว ฉันต้องทำด้วยตนเองหรือไม่?
user496949

3
อ๋อ สร้างด้วยตนเองresourcesและlog4j.propertiesในโฟลเดอร์ที่กล่าวถึงในคำตอบ
Nishant

@ user496949: ไฟล์ที่อยู่ด้านล่างsrc/main/resourcesจะถูกคัดลอกตามค่าเริ่มต้นเป็นtarget/classes
splash

17
เว้นแต่คุณตั้งใจจะส่งออกการตั้งค่า log4j ของคุณเป็นส่วนหนึ่งของอาร์ติแฟกต์ของคุณ - ควรวางไว้ใน src / test / resources จะดีกว่ามาก
David Victor

1
@FerasOdeh เพื่อแยกออกจากสิ่งประดิษฐ์ที่สร้างขึ้น (ไหสงคราม ฯลฯ ) และใช้เฉพาะในระหว่างการทดสอบ "เว้นแต่คุณตั้งใจจะส่งออกการตั้งค่า log4j เป็นส่วนหนึ่งของสิ่งประดิษฐ์ของคุณ"
Ali Shakiba

60

เพียงแค่ใส่เข้าไปก็src/main/resourcesจะรวมอยู่ในอาร์ติแฟกต์ เช่นถ้าอาร์ติแฟกต์ของคุณเป็น JAR คุณจะมีlog4j.propertiesไฟล์อยู่ภายในซึ่งจะสูญเสียจุดเริ่มต้นในการกำหนดค่าการบันทึก

ฉันมักจะใส่ไว้src/main/resourcesและตั้งค่าให้ส่งออกไปยังเป้าหมายดังนี้:

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

นอกจากนี้เพื่อให้ log4j สามารถมองเห็นได้จริงคุณต้องเพิ่มไดเร็กทอรีเอาต์พุตลงในคลาสพา ธ หากอาร์ติแฟกต์ของคุณเป็น JAR ที่สามารถเรียกใช้งานได้คุณอาจใช้ maven-assembly-plugin เพื่อสร้างมันขึ้นมา ภายในปลั๊กอินนั้นคุณสามารถเพิ่มโฟลเดอร์ปัจจุบันของ JAR ลงในพา ธ คลาสได้โดยการเพิ่มClass-Pathรายการในรายการดังนี้:

<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>

ตอนนี้ไฟล์ log4j.properties จะอยู่ถัดจากไฟล์ JAR ของคุณซึ่งสามารถกำหนดค่าได้อย่างอิสระ

ในการรันแอ็พพลิเคชันของคุณโดยตรงจาก Eclipse ให้เพิ่มresourcesไดเร็กทอรีไปยัง classpath ของคุณในการกำหนดค่าการรันของคุณ: Run->Run Configurations...->Java Application->NewเลือกClasspathแท็บเลือกAdvancedและเรียกดูsrc/resourcesไดเร็กทอรีของคุณ


2
ตัวเลือกอื่นอาจจะวางไว้ใต้ src / test / resources เพื่อไม่ให้รวมกลุ่ม
rogerdpack

ว้าว. ขอบคุณสำหรับสิ่งนั้น นี่คือสิ่งที่ฉันต้องการ!
blissfool

@ Zoltánฉันพบว่ายากที่จะเพิ่มไดเร็กทอรีเอาต์พุตไปยัง classpath ตามที่คุณแนะนำ มีวิธีใดบ้างที่ฉันสามารถทำได้ด้วยตนเองเช่นเข้าไปในไฟล์. classpath ของโปรเจ็กต์เฉพาะและเพิ่มไดเร็กทอรีเอาต์พุต log4j ที่นั่นเพื่อให้ log4j สามารถเห็นไฟล์. คุณสมบัติหลังจากรวมแอพเป็นไฟล์. war นอกจากนี้แท็ก targetPath ควรใช้ค่าตามที่เป็นอยู่${project.build.directory}หรือควรแก้ไขเส้นทางจริงที่โครงการอยู่ในไดรฟ์ในเครื่องของฉัน
Ireti

26

"การขุดข้อมูล" บางบัญชีsrc/main/resourcesเป็นสถานที่ทั่วไป

ผลการค้นหาGoogle Code :

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

4
คำตอบนี้แตกต่างจากที่ตอบเมื่อ 20 นาทีที่แล้วอย่างไร ก็resourcesไม่ใช่นะresourceถ้าจำไม่ผิด
Nishant

6
@ Nishant: ก็ไม่ต่างกันเพราะพอเปิดกล่องคำตอบก็เปิด PC ทิ้งไว้ หลังจากกลับมาและตอบคำถามฉันพลาดที่ตอบคำถามไปแล้ว resourceเป็นเพียงการพิมพ์ผิด
สาด

1
ฉันขอแนะนำให้อ่านเกี่ยวกับ maven ปลั๊กอินคอมไพเลอร์ maven ข้อตกลงสำหรับโครงร่างของโครงการ maven อาจจะดูว่าอะไรไปที่ใดภายใต้ "เป้าหมาย" เมื่อสิ่งประดิษฐ์ของคุณถูกสร้างขึ้น บางทีคุณอาจแก้ไขคำตอบของคุณ
David Victor

4
คำตอบที่ถูกต้องคือ src / xxx / resources - ไม่ใช่แบบแผน ดู: maven.apache.org/plugins/maven-resources-plugin/examples/… - ที่นี่ "xxx" อาจเป็น "main" หรือ "test" หากคุณไม่ต้องการให้ระดับการบันทึกที่กำหนดไว้ล่วงหน้าโดยทั่วไปจะเป็นการดีกว่าที่จะกำหนดค่าการบันทึกตามที่จำเป็นสำหรับการทดสอบ - ผ่านทาง 'src / test / resources' - และอนุญาตให้ผู้บริโภคของสิ่งประดิษฐ์ของคุณตั้งค่าระดับการบันทึก
David Victor

22
ผลลัพธ์ของ Google สำหรับ "กระโดดลงจากสะพาน": 18.200.000 ผลการค้นหาของ Google สำหรับ "อย่ากระโดดลงจากสะพาน": 137.000
djjeck

9

ทรัพยากรที่ใช้ในการเตรียมใช้งานโปรเจ็กต์ควรอยู่ในโฟลเดอร์src / main / resources ในการเปิดใช้งานการโหลดทรัพยากรเหล่านี้ในระหว่างการสร้างเราสามารถเพิ่มรายการใน pom.xml ในโครงการ maven เป็นทรัพยากรในการสร้าง

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

นอกจากนี้ยังสามารถเก็บไฟล์. property อื่น ๆ ไว้ในโฟลเดอร์นี้เพื่อใช้สำหรับการเตรียมใช้งาน การกรองถูกตั้งค่าเป็นจริงหากคุณต้องการให้มีตัวแปรบางตัวในไฟล์คุณสมบัติของโฟลเดอร์ทรัพยากรและเติมข้อมูลจากไฟล์คุณสมบัติตัวกรองโปรไฟล์ซึ่งเก็บไว้ใน src / main / ตัวกรองซึ่งตั้งค่าเป็นโปรไฟล์แต่เป็นกรณีการใช้งานที่แตกต่างกันโดยสิ้นเชิง . ในตอนนี้คุณสามารถเพิกเฉยได้

นี่คือปลั๊กอินทรัพยากร mavenทรัพยากรที่ยอดเยี่ยมมีประโยชน์เพียงแค่เรียกดูส่วนอื่น ๆ ด้วย


หากคุณเพียงคัดลอกและวางข้อมูลโค้ด maven ด้านบนโปรดทราบว่าเป็น </resources> </build>
rdesilva

6

เมื่อวางไฟล์ทรัพยากรในตำแหน่งอื่นไม่ใช่ทางออกที่ดีที่สุดที่คุณสามารถใช้ได้:

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

ตัวอย่างเช่นเมื่อไฟล์รีซอร์ส (เช่น jaxb.properties) อยู่ลึกเข้าไปในแพ็กเกจพร้อมกับคลาส Java


1

หากไฟล์ log4j.properties หรือ log4j.xml ของคุณไม่พบภายใต้ src / main / resources ให้ใช้ PropertyConfigurator.configure ("log4j.xml") นี้

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

0

เพิ่มโค้ดด้านล่างจากแท็กทรัพยากรใน pom.xml ของคุณภายในแท็กบิลด์ ดังนั้นจึงหมายความว่าแท็กทรัพยากรต้องอยู่ในแท็กบิลด์ใน pom.xml ของคุณ

<build>
    <resources>
        <resource>
            <directory>src/main/java/resources</directory>
                <filtering>true</filtering> 
         </resource>
     </resources>
<build/>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.