Soru Maven ve Intellij arasındaki Junits'te göreli yolla nasıl başa çıkılır


Bir modül ile bir maven projem var.

/myProject
pom.xml
    /myModule
    pom.xml
       /foo
       bar.txt

İçinde bir Junit düşünün MyModule açması gereken bar.txtmaven ile basedir, modül dizini.

Dosyayı açmak için bar.txt  :

  new File("foo/bar.txt")

Bu, çalıştırdığınızda iyi çalışır mvn test  FAKAT aynı cinayeti başlattığınızda intellijIntellij, modül dizinini değil, proje dizinindeki basediri ayarladığı için başarısız olur.

Intellij açmaya çalışıyor myProject/foo/bar.txt yerine myProject/myModule/foo/bar.txt

Bununla başa çıkmanın bir yolu var mı?


44
2018-04-12 15:31


Menşei


Teşekkür ederim! Bu benim tam sorunumdu - Rupert Madden-Abbott


Cevaplar:


Kodunuzu korumak istiyorsanız, çalışma dizini çalıştırma / hata ayıklama yapılandırmasında değiştirmeyi deneyebilirsiniz (açılan kutuda ilk girmek istediğiniz yere erişim sağlar) Bunu modül kökünüze ayarlayın. Ancak önerilen diğer yaklaşımı tercih edin:

ClassLoader.getSystemResourceAsStream(youPath) 

Ya da tercih ettiğim:

getClass.getResource(youPath)

veya

getClass.getResourceAsStream(youPath)

Yoldaki bir '/', projenizin çalışma yönünü gösterirken, '/' mevcut sınıfa göre göreli bir dir.

Testlerim için bu son çözümü kullanıyorum: Test veri kaynaklarımı test kaynağıyla aynı paket düzeyinde veya çok dağınık paketlerden kaçınmak için bir alt adımda koydum.

Bu şekilde karmaşık bir yol olmadan ve çalışma dizini ile uğraşmak zorunda kalmadan basit bir çağrı yapabilirim:

project-root  
  - module A  
    - src  
      - test
        - rootfile.txt  
        - my-complicated-package-naming-root
          - mypackage
            - Test.java
            - testResource.xml  

Dosyaları şu şekilde alabilirim:

final URL rootfile= Test.class.getResource("/rootfile.txt");
final URL testResource= Test.class.getResource("testResource.xml");

25
2018-04-12 15:54



teşekkürler bu bir çözüm - tbruyelle
Junit çalışma dizinini $ MODULE_DIR $ olarak ayarladım ve beklendiği gibi çalışıyor. Ne yazık ki bu değişken varsayılan giriş konfigürasyonunda kullanmak mümkün değil! Ne utanç... - tbruyelle
$ $ $ MODULE_DIR $ varsayılan cıvıltı konfigürasyonunda önerilmiyor, ama çalışmayı çalışan "çalışma konfigürasyonu" alanına zorlayabilirsiniz! - tbruyelle
@iangreen: Durumun gerçekten olduğundan emin misiniz? - Dokümanları alıntılamak ister misiniz? - Rekin


Guillaume'den esinlenen çözüm:

İçinde Run->Edit configuration->Defaults->JUnit->Working directory değeri ayarla $MODULE_DIR$ ve Intellij, tıpkı Maven gibi tüm zaferlerde göreceli yolu kuracak.


84
2018-04-12 16:50



Bu benim yaklaşımım - DaShaun
Mükemmel! Bunun bana ve ekibime ne kadar zaman harcadığına dair hiçbir fikrin yok, bu nerede belgelendi? - Sam Hendley
hiçbir yerde, ama şimdi Intellij'in yeni versiyonu MODULE_DIR için değer Working directory Metin alanı - tbruyelle
Dosya sistemini kullanmak kötülük mü? Ve sonunda, nihai dosyanın nereden geldiğini düşünüyorsunuz ??? Bazı durumlarda, ör. Bir C.I. Sunucunuzda bulunmayan test durumlarınızda kullanılacak kaynak yapılandırma dosyalarını belirtmek isteyebilirsiniz. Lütfen kötü dosya sistemini kullanmamaları için onlara nasıl ulaşacağımı açıkla. Teşekkür ederim. - Lawrence
Bunun varsayılan JUnit başlatma yapılandırmanızı değiştirdiğinin farkında olun. Bu nedenle, zaten oluşturduğunuz tüm yapılandırmaları değiştirmez. Bu çözüm sizin için işe yaramıyorsa, gerçekte hangi yapılandırmayı kullandığınızı ve bu değeri doğru şekilde mi aldığını kontrol edin. - Rupert Madden-Abbott


a) Dosyaları kullanmayın, InputStreams kullanın. senin olsun InputStream üzerinden

ClassLoader.getSystemResourceAsStream("foo/bar.xml")

Dosyalarla ilgilenen çoğu API, InputStreams ile de mutlu.

b) Kullanmayın foo dizinleri, hem maven hem de IDE'nizi kullanarak dizinleri kullanın (örn. src/main/resources veya src/test/resourcesbu yüzden sınıf yolundalar.

c) Kesinlikle gereksinim duyan bir API'niz varsa File, değil InputStreamhala yapabilirsin

new File(ClassLoader.getSystemResource("foo/bar.xml").toURI())

12
2018-04-12 15:38



projenizde groovy kullanıyorsanız dikkatli olun: ClassLoader.getSystemResourceAsStream, çalışmayı durdurabilir (her zaman geri dönme) çünkü intellij bir komut satırı sarmalayıcı / dinamik proxy kullanmaya başlar. Bu özelliği devre dışı bırakmak için bakın jguru.com/faq/view.jsp?EID=1533847. Neler olduğunu anlamaya çalışırken çok saat kaybettim. - Guillaume
Bu şeylerin farkında olduğum için teşekkürler, ancak yolu bazı parametrelerde yapılandırıldığı için sınıf yolunda bulunamayan bir Dosya almam gerekiyor. Göreceli yolla gerçekten bir çözüme ihtiyacım var. - tbruyelle


Çalıştır / Hata Ayıklama Yapılandırmaları penceresinde test yürütücüsü için çalışma dizini belirtebilirsiniz:

enter image description here


1
2018-03-16 17:26





Proje dosyalarınızı (.idea) kaynak kodla aynı dizinde tutarsanız, @tbruyelle çözümü çalışır. Eğer seçersen Proje dosyalarını saklayın ... farklı bir konumda, $ MODULE_DIR $ çalışma alanı dizinine bakmaya çalışıyor ve yollar bulunamıyor. Bu IntelliJ üzerinde bir hataya benziyor, umarım kısa sürede çözerler.

Çözüm: Çalışma dizinindeki maven modülünün mutlak / göreli yolunu belirtebilirsiniz

$MODULE_DIR$/../master/mavenmodule1

$MODULE_DIR$: points to workspace directory
../: relative path to source code
master: root directory of your source code
mavenmodule1: maven module name / directory name of the child module.

Çoklu modül maven projesi için bir seçeneğiniz yok, bu modüle işaret eden farklı bir çalışma konfigürasyonuna sahip olmanız gerekir. Keşke tüm modüller için bu yapılandırmayı kullanabilmemiz için $ MAVEN_MODULE $ ($ MODULE_DIR $ / .. / master / $ MAVEN_MODULE $) değerini gösteren başka bir değişken var. Yukarıdaki örnekte, $ MAVEN_MODULE $ mavenmodule1 ile değiştirilecek


0
2017-10-06 15:55