Maven 3 और JUnit 4 संकलन समस्या: पैकेज org.junit मौजूद नहीं है


80

मैं मावेन के साथ एक सरल जावा परियोजना बनाने की कोशिश कर रहा हूं। मेरी पोम-फाइल में मैंने JUnit 4.8.2 को एकमात्र निर्भरता घोषित किया है। फिर भी मावेन JUnit संस्करण 3.8.1 का उपयोग करने पर जोर देता है। मैं इसे कैसे ठीक करूं?

समस्या स्वयं को संकलन विफलता में प्रकट करती है: "पैकेज org.junit मौजूद नहीं है"। यह मेरे स्रोत कोड में आयात विवरण के कारण है। JUnit 4 में सही पैकेज का नाम।

मुझे लगता है कि मैंने http://maven.apache.org/plugins/maven-surefire-plugin/examples/junit.html पर समस्या की जड़ पर प्रलेखन पाया है, लेकिन वहाँ सलाह मावी विशेषज्ञों के लिए होने लगती है। मुझे समझ नहीं आ रहा था कि मैं क्या करूं।


21
मैंने मावेन 3 के साथ काम नहीं किया है, लेकिन मेरा पहला अनुमान यह होगा कि आपका परीक्षण वर्ग src / main / java में है और आपका POM जूनिट को एक परीक्षण निर्भरता के रूप में परिभाषित करता है (अर्थात, "स्कोप" तत्व का मान "टेस्ट" है ”)। मैं आपके POM को देखे बिना और आपके प्रोजेक्ट की संरचना को जाने बिना निश्चित रूप से नहीं कह सकता।
सारा रॉबर्ट्स

2
मावेन जुनीत पर जोर नहीं देता है कि वह कौन है जो आपको होना चाहिए ... ऐसा लगता है कि आपने अपने टेस्ट कक्षाओं को सही स्थान src / test / java में स्थित नहीं किया है ... और निश्चित रूप से पोम अत्यधिक सहायक होगा।
खमरबाईस

जवाबों:


52

आगंतुकों की मदद करने के लिए पूर्ण समाधान के साथ उत्तर देने के लिए बस:

आपको बस इतना करने की जरूरत है कि जूनिट निर्भरता को जोड़ा जाए pom.xml। मत भूलना<scope>test</scope>

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.11</version>
  <scope>test</scope>
</dependency>

1
हां, आपके जूनट का संस्करण मायने रखता है। मैंने इसे 3.8.1 से 4.11 में अपग्रेड किया, और इसने मेरी समस्या हल कर दी।
महसा 2

इसे 3.11 से 4.11 में बदल दिया और यह भी काम करता है, लेकिन मैं सोच रहा हूं कि पहले के संस्करण जूनिट के लिए यह कैसे होगा।
टिआना

45

@ डेनिस रॉबर्ट्स: आप बिल्कुल सही थे: मेरा टेस्ट क्लास src / main / java में स्थित था। इसके अलावा JUnit के लिए पोम में "गुंजाइश" तत्व का मूल्य "परीक्षण" था, हालांकि यह है कि यह कैसे माना जाता है। समस्या यह थी कि मैं ग्रहण में टेस्ट क्लास बनाते समय मैला हो गया था, जिसके परिणामस्वरूप इसे src / test / java के src / main / java में बनाया गया था। "मावन एक्लिप्स: एक्लिप्स" को चलाने के बाद एक्लिप्स के प्रोजेक्ट एक्सप्लोरर दृश्य में यह देखना आसान हो गया, लेकिन आपकी टिप्पणी ने मुझे पहले इसे देखने के लिए प्रेरित किया। धन्यवाद।


मैंने कुछ फ़ाइलों को परीक्षण से मुख्य में स्थानांतरित कर दिया, और मेरे जूनियर असटर ने त्रुटि फेंकना शुरू कर दिया। <दायरे> परीक्षण </ गुंजाइश> को हटाकर समस्या को हल कर दिया गया। धन्यवाद!
pMan

मैं परीक्षण के लिए मुख्य से एक टेस्ट फ़ाइल ले गया। फिर मावेन ने जूनियर <स्कोप> टेस्ट </ स्कोप> से सफलता हासिल की। धन्यवाद एक बहुत
eleforest

अविश्वसनीय, मुझे एक ही समस्या थी। और चूँकि जेनकिन्स ने src / main में अपने परीक्षण की परवाह नहीं की, इसलिए मैंने भी ध्यान नहीं दिया।
पीटर डी ब्यू

19

मेरी समस्या मेरे अंदर एक लाइन pom.xmlथी, मेरे पास इस लाइन <sourceDirectory>${basedir}/src</sourceDirectory>को हटाने वाली लाइन थी, जो नियमित संरचना वाले फ़ोल्डरों का उपयोग करती थी जो मेरे मुद्दे को हल करती थी


1
हटाने के बाद मेरे लिए इसका काम कर <sourceDirectory> src << sourceDirectory> अपने काम कर रहे
ठाकरे प्रशांत

12

junit के लिए pom.xml में स्कोप टैग को हटाने का काम किया।


4
यह समाधान खराब है, क्योंकि अब आप अपने जॉइंट टेस्ट क्लासेस को अपने प्रोडक्ट बाइनरी में भेज रहे हैं।
avgvstvs 17

5

मुझे भी यही समस्या थी। सब मैंने किया था - pom.xml फ़ाइल से मैंने junit 3.8 के लिए निर्भरता को हटा दिया और junit 4.8 के लिए एक नई निर्भरता जोड़ दी। तब मैंने मावेन को साफ और मावेन स्थापित किया। इसने चाल चली। सत्यापित करने के लिए, maven इंस्टॉल होने के बाद मैं प्रोजेक्ट गया-> गुण-निर्माण पथ-> maven निर्भरताएँ और देखा कि अब junit 3.8 jar चला गया है!, बजाय junit 4.8 jar सूचीबद्ध है। ठंडा!!। अब मेरा टेस्ट एक आकर्षण की तरह चलता है .. उम्मीद है कि यह किसी तरह मदद करता है ..


हां, लेकिन @ FrVaBe का जवाब तब मिलता है जब आपके सहकर्मी को आपका कोड (और आपका pom.xml) मिल जाता है, उसे फिर से आपके समाधान का पता नहीं लगाना पड़ेगा। यह सिर्फ सही ढंग से काम करेगा।
रस बेटमैन


4

मेरा मामला एक साधारण निरीक्षण था।

मैं JUnit निर्भरता घोषणा के अंदर डाल <dependencies>के तहत <dependencyManagement/>नोड के बजाय <project/>पोम फ़ाइल में। सही तरीका है:

<project>
<!-- Other elements -->
    <dependencies>
    <!-- Other dependencies-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>
    </dependencies>
<project>

4

आपने संस्करण कैसे घोषित किया?

<version>4.8.2</version>

इस घोषणा से स्पष्ट अर्थ से अवगत रहें (यहां देखें नोट) :

जब "सामान्य" संस्करण की घोषणा की जाती है, जैसे कि 3.8.2, जूनिट के लिए, आंतरिक रूप से इसे "कुछ भी अनुमति दें, लेकिन 3.8.2 पसंद करते हैं" के रूप में दर्शाया गया है। इसका मतलब यह है कि जब एक संघर्ष का पता लगाया जाता है, तो मावेन को सर्वश्रेष्ठ संस्करण चुनने के लिए संघर्ष एल्गोरिदम का उपयोग करने की अनुमति दी जाती है। यदि आप [3.8.2] निर्दिष्ट करते हैं, तो इसका मतलब है कि केवल 3.8.2 का उपयोग किया जाएगा और कुछ नहीं।

संस्करण का उपयोग करने के लिए मजबूर करने के लिए 4.8.2 प्रयास करें

<version>[4.8.2]</version>

जैसा कि आप अपनी परियोजना में कोई अन्य निर्भरता नहीं रखते हैं, ऐसी कोई भी समस्या नहीं होनी चाहिए जो आपकी समस्या का कारण हो। यदि आप इस संस्करण को एक भंडार से प्राप्त करने में सक्षम हैं, तो पहली घोषणा आपके लिए काम करना चाहिए। क्या आपको मूल माता-पिता से निर्भरता विरासत में मिलती है?


1
कम से कम उस संस्करण <version>[4.8.2,)</version>को लागू करने के लिए बेहतर नहीं होगा ?
जोकिम सॉयर

3
@Joachim Sauer वर्जन रेंज का उपयोग वर्तमान में SNAPSHOT वर्जन ( लिंक ) को भी हल करता है - और यह बहुत ही विवादास्पद है कि अगर यह एक अच्छी अवधारणा है। यदि आपको SNAPSHOT संस्करण प्राप्त करने में कोई आपत्ति नहीं है तो आपका सुझाव काफी उपयोगी है।
FrVaBe

3

मेरे पास सही स्थानों पर मेरी फाइलें थीं, और सिर्फ <scope>test</scope>JUnit निर्भरता प्रविष्टि से हटाने से समस्या हल हो गई (मैं JUnit 4.12 का उपयोग कर रहा हूं)। मेरा मानना ​​है कि testगुंजाइश के साथ संकलन चरण के दौरान निर्भरता को अनदेखा किया जा रहा था। अब सब कुछ काम कर रहा है जब मैं फोन करता हूं mvn test


3

मुझे एक "परीक्षण-बर्तन" परियोजना में बहुत कुछ इसी तरह की समस्या थी (आश्रितों को इंजेक्शन लगाने वाली एक मूल परियोजना के बच्चे जेयूनिट के लिए सुविधाएँ, नियम और दावे जोड़ते हुए)। Org.junit.rules पैकेज के आधार पर वर्ग src / main / java में था।

इसलिए मैंने परीक्षण गुंजाइश के बिना कनिष्ठ पर निर्भरता को जोड़ा और इसने समस्या को हल किया:

परीक्षण-उपयोग परियोजना का pom.xml:

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
</dependency>

मूल परियोजना का pom.xml:

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <scope>test</scope>
</dependency>

1

मुझे ग्रहण की इसी तरह की समस्या थी, जो मेरे कोड को ठीक-ठीक संकलित कर रही थी लेकिन मावेन तब विफल हो गई जब हर बार परीक्षणों का संकलन करने के बावजूद तथ्य यह था कि जेयूनिट मेरी निर्भरता की सूची में था और परीक्षण / src / test / java / में थे।

मेरे मामले में, मेरी निर्भरता की सूची में JUnit का गलत संस्करण था। मैंने JUnit4 परीक्षण (एनोटेशन के साथ) लिखा था, लेकिन मेरे निर्भरता के रूप में JUnit 3.8.x था। JUnit के संस्करण 3.8.x और 4 के बीच उन्होंने junit.framework से संकुल नाम को बदलकर org.junit कर दिया है, यही वजह है कि मावेन अभी भी एक JUnit जार का उपयोग कर संकलन तोड़ता है।

मैं अभी भी पूरी तरह से निश्चित नहीं हूं कि ग्रहण सफलतापूर्वक संकलित क्यों हुआ। क्लासपीठ में कहीं न कहीं यह JUnit4 की अपनी प्रति होनी चाहिए। आशा है कि यह वैकल्पिक समाधान लोगों के लिए उपयोगी है। मैं ऊपर के आर्थर लिंक के बाद इस समाधान पर पहुंचा।


1

मैं इस मुद्दे में भी भाग गया - मैं एक स्रोत से एक वस्तु में खींचने की कोशिश कर रहा था और यह परीक्षण कोड में काम कर रहा था लेकिन src कोड नहीं। आगे के परीक्षण के लिए, मैंने परीक्षण से कोड के एक ब्लॉक की प्रतिलिपि बनाई और इसे src कोड में गिरा दिया, फिर तुरंत JUnit लाइनों को हटा दिया, इसलिए मेरे पास बस इतना था कि परीक्षण ऑब्जेक्ट में कैसे खींच रहा था। फिर अचानक मेरा कोड संकलन नहीं होगा।
मुद्दा यह था कि जब मैंने कोड को छोड़ दिया, तो ग्रहण ने सभी कक्षाओं को मदद से हल कर दिया, इसलिए मेरे पास मेरे src कोड से आने वाले JUnit कॉल थे, जो उचित नहीं था। मुझे अप्रयुक्त आयातों के बारे में शीर्ष पर चेतावनी पर ध्यान देना चाहिए था, लेकिन मैंने उन्हें देखने के लिए उपेक्षा की।
एक बार जब मैंने अपने src फ़ाइल में अप्रयुक्त JUnit आयात को हटा दिया, तो यह सब बहुत खूबसूरती से काम किया।


1

मुझे भी उसी तरह की समस्या थी जैसा कि नीचे दिखाया गया है।

यहाँ छवि विवरण दर्ज करें

समस्या को हल करने के लिए, dependenciesएप्लिकेशन स्तर build.gradle में अनुभाग में नीचे लाइनें जोड़ी जाती हैं।

compile 'junit:junit:4.12'
androidTestCompile 'com.android.support.test:runner:0.5'

ग्रेडल बिल्ड ने फिर चेतावनी के बाद सूचना दी।

Warning:Conflict with dependency 'com.android.support:support-annotations'. 
Resolved versions for app (25.1.0) and test app (23.1.1) differ. 
See http://g.co/androidstudio/app-test-app-conflict for details.

इस चेतावनी को हल करने के लिए, निम्न अनुभाग एप्लिकेशन स्तर build.gradle में जोड़ा जाता है।

configurations.all {
    resolutionStrategy {
        force 'com.android.support:support-annotations:23.1.1'
    }
}

0

यदि आप src / main / java Utils में कोड रखते हैं, तो इस त्रुटि का एक समाधान खोजें

<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.9.1</version>
</dependency>

0

जूनियर संस्करण को बदलना मेरे लिए यह तय किया। संस्करण 3.8.1 की तरह लगता है मेरे मामले में काम नहीं किया। इसे 4.12 में बदलने पर समस्या का समाधान


-1

डिफ़ॉल्ट रूप से, मावेन इन फ़ोल्डरों को क्रमशः जावा और टेस्ट कक्षाओं के लिए देखता है - src / main / java और src / pava

जब स्रोत के तहत परीक्षण वर्गों के साथ src निर्दिष्ट किया जाता है और pom.xml में जून निर्भरता के लिए गुंजाइश परीक्षण के रूप में उल्लिखित है - org.unit मावेन द्वारा नहीं मिलेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.