เพิ่มไฟล์คุณสมบัติไปยัง classpath ของ IntelliJ


122

ฉันใช้โปรแกรม Java อย่างง่ายจาก IntelliJ IDE โดยใช้เมนู Run-> Run มันทำงานได้ดี ตอนนี้ฉันต้องการเพิ่มการบันทึก log4j

ฉันเพิ่มโฟลเดอร์ทรัพยากรภายใต้รูทโปรเจ็กต์ของฉัน ฉันเพิ่มไฟล์ log4j.properties ในโฟลเดอร์นั้น ฉันเปลี่ยนรหัสเพื่อบันทึกบางอย่าง

อะไรคือวิธีที่ถูกต้องในการบอกให้ IntelliJ รวมโฟลเดอร์ทรัพยากรใน classpath เพื่อให้เห็นไฟล์คุณสมบัติ

ด้วย IntelliJ 8 ฉันเดาได้ว่าเหมือนลิงเมาและในที่สุดก็ใช้งานได้ ตอนนี้ฉันมี 9 คนแล้วและฉันไม่ประสบความสำเร็จเลย ฉันพยายามมาหนึ่งชั่วโมงแล้ว แล้วตัวเลือก "Add to classpath" บางที่ล่ะ / fume / vent / พร่ำเพ้อ


โอเคสถานการณ์คลี่คลายแล้ว นี่เป็นการติดตั้ง IntelliJ ใหม่ - log4J ไม่รวมอยู่ในค่าเริ่มต้น ในรหัสของฉันฉันได้นำเข้าเครื่องบันทึกสต็อคไม่ใช่ log4j คนตัดไม้รองรับวิธีการที่คล้ายกันดังนั้นจึงไม่ชัดเจนว่าฉันใช้คนตัดไม้ผิด! ไม่แปลกใจเลยว่าทำไมมันไม่อ่านไฟล์คุณสมบัติ log4j หรือการรายงานที่ฉันต้องกำหนดค่า log4j เตะต่อยอะไรกัน!
Tony Ennis

พบคำอธิบายที่ดีสำหรับผู้เริ่มต้น log4j tuttlem.github.io/2015/02/08/start-logging-with-log4j2.html
Rahal Kanishka

คำตอบ:


91

ลองสิ่งนี้:

  • ไปที่โครงสร้างโครงการ
  • เลือกโมดูลของคุณ
  • ค้นหาโฟลเดอร์ในแผนภูมิทางด้านขวาแล้วเลือก
  • คลิกปุ่ม Sources เหนือต้นไม้นั้น (พร้อมโฟลเดอร์สีน้ำเงิน) เพื่อทำให้โฟลเดอร์นั้นเป็นโฟลเดอร์ต้นทาง

ฉันทำแบบนั้นประมาณ 50 ครั้งแล้วฉันก็ทำอีกครั้ง ผลลัพธ์ของฉันไม่เปลี่ยนแปลงแม้ว่าฉันจะเปลี่ยนรูปแบบการแปลงเค้าโครงเป็นสิ่งที่เห็นได้ชัด ฉันสงสัยว่า log4j.properties อื่นอยู่ใน classpath ของฉันหรือไม่
Tony Ennis

29
ตรวจสอบรูปแบบทรัพยากรในการตั้งค่าคอมไพเลอร์ ตรวจสอบว่ามี "? *. properties" อยู่ในนั้น มันอยู่ที่นั่นตามค่าเริ่มต้น แต่นั่นเป็นสิ่งเดียวที่ฉันคิดได้จากด้านบนของหัว
ColinD

3
ทางเลือกสำหรับปุ่ม Sources - คลิกขวาที่ Directory ที่คุณสร้างขึ้นและเลือก "Mark Directory As": "Source Root"
mschr

10
โปรดทราบว่าหากคุณสร้างโปรเจ็กต์จาก Maven POM แทนที่จะเป็นโครงสร้างซอร์สเฉพาะกิจโซลูชันนี้จะไม่ทำงาน แต่คุณต้องเพิ่มไดเรกทอรีนั้นเป็นทรัพยากรใน POM ดูคำตอบของ Peter Thygesen
lreeder

นอกจากนี้ยังสามารถดำเนินการทางโปรแกรมผ่านทาง PropertyConfigurator.configure ("../ conf / log4j.properties")
Jason D

47

จริงๆแล้วคุณมีอย่างน้อย 2 วิธีในการดำเนินการวิธีแรกอธิบายโดย ColinD คุณเพียงกำหนดค่าโฟลเดอร์ "ทรัพยากร" เป็นโฟลเดอร์ Sources ใน IDEA หากรูปแบบทรัพยากรมีส่วนขยายของทรัพยากรของคุณรูปแบบนั้นจะถูกคัดลอกไปยังไดเร็กทอรีเอาต์พุตเมื่อคุณทำให้โปรเจ็กต์และไดเร็กทอรีเอาต์พุตเป็นคลาสพา ธ ของแอ็พพลิเคชันของคุณโดยอัตโนมัติ

อีกวิธีหนึ่งคือการเพิ่มโฟลเดอร์ "resources" ลงใน classpath โดยตรง ไปที่โครงสร้างโครงการ | โมดูล | โมดูลของคุณ | อ้างอิงคลิกAdd , ทางเข้าทางเดียวโมดูลห้องสมุดระบุเส้นทางไปยัง "ทรัพยากร" โฟลเดอร์

อีกวิธีหนึ่งคือการวางไฟล์log4j.propertiesโดยตรงภายใต้รากต้นทางของโปรเจ็กต์ของคุณ เหมือนกับวิธีแรกยกเว้นว่าคุณไม่จำเป็นต้องเพิ่ม Source root อื่นในการตั้งค่าModule Pathsไฟล์จะถูกคัดลอกไปยังไดเร็กทอรีเอาต์พุตบน Make

หากคุณต้องการที่จะทดสอบกับการกำหนดค่า log4j ที่แตกต่างกันก็อาจจะง่ายต่อการระบุแฟ้มการกำหนดค่าที่กำหนดเองโดยตรงในการกำหนดค่า Run / Debug , พารามิเตอร์ VMยื่นที่ชอบ:

-Dlog4j.configuration=file:/c:/log4j.properties.


ฉันทำวรรค 2 และ 3 ของคุณแล้วไม่มีผล ฉันแน่ใจว่าคำแนะนำใช้งานได้ แต่มันไม่มีผล - มันจะทำงานเหมือนมีไฟล์ log4j.properties อื่นใน classpath แต่ไม่เห็นมีที่ไหนเลย ถ้าฉันลบไฟล์คุณสมบัติ log4j ของฉันทั้งหมดฉันไม่ได้รับ "คุณต้องกำหนดค่าคำเตือน log4j" ในคอนโซล ฉันใช้ IntelliJ ฟรี (และเวอร์ชัน 9.x) เป็นครั้งแรกดังนั้นอาจเกี่ยวข้องกับสิ่งนั้น
Tony Ennis

1
การใช้พารามิเตอร์ Explicit -D VM ก็ไม่มีผลเช่นกัน ณ จุดนี้ฉันทำได้เพียงแค่คาดเดาว่าฉันได้ตกลงมาจากยอด 'ต้นไม้โง่ ๆ ' และฟาดกิ่งไม้ทุกกิ่งที่ขวางทาง! ฉันคิดว่าฉันจะไปอวนลากที่ JetBrains และถามรอบ ๆ ...
Tony Ennis

คุณช่วยกรุณาส่งโครงการตัวอย่างพร้อมขั้นตอนที่แน่นอนในการสร้างปัญหามาที่ support@jetbrains.com
CrazyCoder

ฉันส่งผ่าน -Dlog4j.configuration = file: / c: /log4j.properties ในอาร์กิวเมนต์ของโปรแกรม พารามิเตอร์ VM เป็นเคล็ดลับสำหรับฉัน
Ajak6

42

ฉันมีปัญหาเดียวกันและทำให้ฉันรำคาญอย่างมาก !!

ฉันคิดมาตลอดว่าฉันถูกคาดหวังให้ทำตามคำตอบที่ 2 ซึ่งเคยทำงานใน Intellij 9 (ตอนนี้ใช้ 10)

อย่างไรก็ตามฉันพบว่าการเพิ่มบรรทัดเหล่านี้ในไฟล์ maven pom ของฉันช่วย:

<build>
  ...
  <resources>
    <resource>
      <directory>src/main/resources</directory>
    </resource>
  </resources>
  ...
</build>

นั่นเป็นปัญหาที่ฉันพบตอนนี้ไฟล์ทรัพยากรถูกคัดลอกไปยังโฟลเดอร์ผลลัพธ์เรียบร้อยแล้ว
artjomka

คำตอบนี้ได้ผลจริงๆ ฉันได้ทำสิ่งที่ colinD แนะนำในความคิดเห็นของเขาด้วย ขอบคุณ.

ขอบคุณนี่เป็นทางออกเดียวที่ได้ผลสำหรับฉัน
Minh Thiện

18

ฉันใช้เวลาค่อนข้างมากในการหาวิธีทำใน Intellij 13x เห็นได้ชัดว่าฉันไม่เคยเพิ่มไฟล์คุณสมบัติไปยังสิ่งประดิษฐ์ที่ต้องการซึ่งเป็นขั้นตอนแยกต่างหากใน Intellij การตั้งค่าด้านล่างยังใช้งานได้เมื่อคุณมีไฟล์คุณสมบัติที่ใช้ร่วมกันโดยหลายโมดูล

  • ไปที่การตั้งค่าโครงการของคุณ (CTRL + ALT + SHIFT + S)
  • ในรายการให้เลือกโมดูลที่คุณต้องการเพิ่มไฟล์คุณสมบัติหนึ่งไฟล์ขึ้นไป
  • ทางด้านขวาให้เลือกแท็บการขึ้นต่อกัน
  • คลิกเครื่องหมายบวกสีเขียวแล้วเลือก "Jars or directory"
  • ตอนนี้เลือกโฟลเดอร์ที่มีไฟล์คุณสมบัติ (ฉันยังไม่ได้ลองรวมไฟล์ทีละไฟล์)
  • ตอนนี้ Intellij จะถามคุณว่า "หมวดหมู่" ของไฟล์ที่เลือกคืออะไร เลือก "คลาส" (แม้ว่าจะไม่ใช่)
  • ตอนนี้คุณต้องเพิ่มไฟล์คุณสมบัติไปยังอาร์ติแฟกต์ Intellij จะให้ทางลัดที่แสดงด้านล่าง มันจะแสดงข้อผิดพลาดในส่วนสีแดงที่ด้านล่างและ 'หลอดไฟสีแดง' ที่เมื่อคลิกจะแสดงตัวเลือกในการเพิ่มไฟล์ลงในอาร์ติแฟกต์ คุณยังสามารถไปที่ส่วน "อาร์ติแฟกต์" และเพิ่มไฟล์ลงในอาร์ติแฟกต์ด้วยตนเอง

ใส่คำอธิบายภาพที่นี่


14

เผชิญกับความท้าทายที่คล้ายกันในการเพิ่มไฟล์ที่มีนามสกุล. ini ไปยัง classpath พบคำตอบนี้ซึ่งก็คือการเพิ่มเข้าไปใน Preferences -> Compiler -> Resource Patterns -> [... ]; *. ini


1
นี่เป็นปัญหาที่แน่นอนที่ฉันพบกับไฟล์. conf
James

ฉันคิดว่ามีอะไรผิดปกติกับรหัสของฉัน? ขอบคุณสำหรับการแก้ปัญหานี้
Shoaib Chikate

5

หากคุณเคยพบปัญหาเดียวกันกับ Scala และ SBT:

  • ไปที่โครงสร้างโครงการ ทางลัดคือ (CTRL + ALT + SHIFT + S)

  • ในรายการด้านซ้ายสุดให้เลือกการตั้งค่าโครงการ> โมดูล

  • ในรายการโมดูลทางขวาให้เลือกโมดูลของชื่อโปรเจ็กต์ของคุณ (ไม่มีบิลด์) และเลือกแท็บแหล่งที่มา

  • ตรงกลางขยายโฟลเดอร์ที่เป็นรูทของโปรเจ็กต์ของคุณสำหรับฉันนั่นคือ /home/<username>/IdeaProjects/<projectName>

  • ดูที่ส่วน Content Root ทางด้านขวาเส้นทางสีแดงคือไดเร็กทอรีที่คุณไม่ได้สร้างขึ้น คุณจะต้องใส่ไฟล์คุณสมบัติในไดเร็กทอรีทรัพยากร ฉันจึงสร้างsrc/main/resourcesและใส่ log4j.properties ลงไป ฉันเชื่อว่าคุณสามารถปรับเปลี่ยน Content Root เพื่อวางได้ทุกที่ที่คุณต้องการ (ฉันไม่ได้ทำ)

  • ฉันรันโค้ดด้วยคอนฟิกูเรชัน SBT และพบไฟล์ log4j.properties ของฉัน

ใส่คำอธิบายภาพที่นี่


2

สำหรับผู้ที่ย้ายจาก Eclipse ไปยัง IntelliJ หรืออีกวิธีหนึ่งคือเคล็ดลับเมื่อทำงานกับไฟล์คุณสมบัติหรือไฟล์ทรัพยากรอื่น ๆ

มันน่าโมโห (เสียเวลาทั้งเย็นเพื่อหาคำตอบ) แต่ IDE ทั้งสองงานค่อนข้างแตกต่างกันเมื่อต้องค้นหาไฟล์ทรัพยากร / เหมาะสมเมื่อคุณต้องการเรียกใช้ภายในเครื่องจาก IDE ของคุณหรือระหว่างการดีบัก (บรรจุภัณฑ์กับ. jar นั้นแตกต่างกันมากเช่นกัน แต่ก็มีการบันทึกข้อมูลที่ดีกว่า)

สมมติว่าคุณมีการอ้างอิงเส้นทางสัมพัทธ์เช่นนี้ในโค้ดของคุณ:

new FileInputStream("xxxx.properties");

(ซึ่งสะดวกถ้าคุณทำงานกับไฟล์. คุณสมบัติเฉพาะของ env ที่คุณไม่ต้องการจัดแพคเกจร่วมกับ JAR ของคุณ)

IntelliJ

(ฉันใช้ 13.1 แต่อาจใช้ได้กับเวอร์ชันอื่น ๆ )

ไฟล์ xxxx.properties ต้องอยู่ที่ PARENT dir ของโปรเจ็กต์ ROOT เพื่อที่จะได้รับในรันไทม์เช่นนี้ใน IntelliJ (โปรเจ็กต์ ROOT คือที่ที่โฟลเดอร์ / src อยู่)

คราส

Eclipse มีความสุขเมื่อไฟล์ xxxx.properties อยู่ที่โปรเจ็กต์ ROOT เอง

ดังนั้น IntelliJ จึงคาดว่าไฟล์ .properties จะสูงขึ้น 1 ระดับจากนั้น Eclipse เมื่ออ้างอิงแบบนี้ !!

นอกจากนี้ยังส่งผลต่อวิธีที่คุณต้องรันโค้ดของคุณเมื่อคุณมีโค้ดบรรทัดเดียวกันนี้ (FileInputStream ใหม่ ("xxxx.properties");) ใน. jar ที่ส่งออกของคุณ เมื่อคุณต้องการความคล่องตัวและไม่ต้องการแพ็กเกจไฟล์. คุณสมบัติด้วย jar ของคุณคุณจะต้องรัน jar ดังต่อไปนี้เพื่ออ้างอิงไฟล์. คุณสมบัติอย่างถูกต้องจากบรรทัดคำสั่ง:

INTELLIJ ส่งออก JAR

java -cp "/path/to_properties_file/:/path/to_jar/some.jar" com.bla.blabla.ClassContainingMainMethod

ขวดส่งออก ECLIPSE

java -jar some.jar

โดยที่ Eclipse ที่เอ็กซ์พอร์ต jar ที่รันได้จะคาดหวังว่าไฟล์. คุณสมบัติที่อ้างอิงจะอยู่บนตำแหน่งเดียวกับที่ไฟล์. jar อยู่


ใช่ logging.properties ซึ่งแตกต่างจาก log4j2.xml หรือ log4j.properties ต้องพบในรูทโมดูล IntelliJ นอกจากนี้ยังแตกต่างจาก Log4j ที่เพิ่งทำงานฉันได้พบฉันยังคงมีให้คณะลูกขุนแท่นขุดเจาะเพื่อให้ทำงานได้ภายใน IntelliJ (คราสจะเป็นเรื่องเดียวกันนี้เป็นความผิดของการเข้าสู่ระบบของ Java) ดูstackoverflow.com/questions/960099/... ทางเลือกหนึ่งคือการแก้ไขการกำหนดค่า run / debug ด้วย -Djava.util.logging.config.file = ซึ่งฉันคิดว่าค่อนข้างไม่สะดวกเนื่องจากฉันต้องการกำหนดค่าในโค้ดหรือในไฟล์คุณสมบัติที่คาดไว้
Russ Bateman

1

บางทีนี่อาจจะไม่ตรงประเด็นเล็กน้อยเนื่องจากคำถามได้รับคำตอบแล้ว แต่ฉันประสบปัญหาที่คล้ายกัน ในกรณีของฉันมีเพียงทรัพยากรทดสอบหน่วยบางส่วนเท่านั้นที่ถูกคัดลอกไปยังโฟลเดอร์ผลลัพธ์เมื่อคอมไพล์ persistence.xmlของฉันในโฟลเดอร์META-INFถูกคัดลอกแต่ไม่มีอะไรอื่นแต่ไม่มีอะไรอื่น

ในที่สุดฉันก็ "แก้ไข" ปัญหาโดยการเปลี่ยนชื่อไฟล์ที่มีปัญหาสร้างโปรเจ็กต์ใหม่แล้วเปลี่ยนชื่อไฟล์กลับเป็นไฟล์เดิม อย่าถามฉันว่าทำไมถึงได้ผล แต่มันก็ทำได้ การคาดเดาที่ดีที่สุดของฉันคืออย่างไรก็ตามโครงการ IntelliJ ของฉันซิงค์กับระบบไฟล์ไม่ได้เล็กน้อยและการดำเนินการเปลี่ยนชื่อเรียกใช้ "การสแกนทรัพยากรใหม่" ภายในบางประเภท


1

นี่เป็นหนึ่งในข้อผิดพลาดโง่ ๆ ที่ฉันเคยทำ ฉันใช้เวลานานมากในการพยายามแก้ไขปัญหานี้และลองทำตามคำตอบทั้งหมดที่โพสต์ไว้ข้างต้น แต่สุดท้ายแล้วมันก็เป็นหนึ่งในข้อผิดพลาดที่โง่เขลาของฉัน

ผมใช้org.apache.logging.log4j.Logger(: บัดซบ :) org.apache.log4j.Loggerในขณะที่ฉันควรจะได้นำมาใช้ การใช้คนตัดไม้ที่ถูกต้องนี้ช่วยบันทึกตอนเย็นของฉัน


0

ฉันมีปัญหาคล้ายกันกับไฟล์ log4j.xml สำหรับการทดสอบหน่วยทำตามทั้งหมดข้างต้น แต่พบว่าเป็นเพราะฉันเพิ่งรันการทดสอบที่ล้มเหลวอีกครั้ง .... ถ้าฉันเรียกใช้คลาสทดสอบทั้งหมดอีกครั้งไฟล์ที่ถูกต้องจะถูกหยิบขึ้นมา อยู่ภายใต้ Intelli-j 9.0.4

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