2010-10-30 4 views
34

मैं एक codebase :)मैवेन से, मैं एक कक्षा कैसे चला सकता हूं जो src/test/java के अंतर्गत रहता है?

src/परीक्षण/जावा के तहत विरासत में मिला है/एक फ़ाइल है कि मैं चलाने की आवश्यकता नहीं है (मैं इसे भीतर अपनी public static void main(String[] args), नहीं एक @Test विधि चलाने की आवश्यकता)।

निकटतम मुझे मिल गया है:

mvn -e exec:java -Dexec.mainClass="com.me.packagex.RunFile" -Dexec.classpathScope="test" 

लेकिन वह तो विफल रहता है, और यह प्रतीत होता है क्योंकि RunFile कक्षाएं कि src के तहत मौजूद/मुख्य/जावा/com/मुझे/packagex/(उपयोग करना चाहता है नोटिस,/मुख्य /, नहीं/परीक्षण /)। वहां मौजूद फाइलें उसी पैकेज में हैं जैसे रनफाइल, यानी 'पैकेज com.me.packagex;'।

यदि मैं -Dexec.classpathScope="test" हटा देता हूं तो यह रनफाइल बिल्कुल नहीं मिल सकता है। ऐसा लगता है कि मुझे इसे दो स्कोप देने की ज़रूरत है, लेकिन यह "परीक्षण, संकलन" स्वीकार नहीं करता है।

जिस व्यक्ति को मैंने इसे प्राप्त किया है (प्रिय रूप से प्रस्थान) इसे ग्रहण से चलाने के लिए उपयोग किया जाता है। मुझे इसे कमांड लाइन से चलाने का एक तरीका चाहिए।

मुझे आशा है कि यह स्पष्ट रूप से समझाया जाएगा।

tyvm,


यह आशाजनक है। पास्कल, मैंने आपके उदाहरण की कोशिश की है और मेरे लिए काम नहीं करता है।

हालांकि अब मैं इसे देखता हूं - यह डॉग नहीं ढूंढने के बजाय डेमो नहीं ढूंढ रहा है।

Apache Maven 2.2.1 (rdebian-1) 
Java version: 1.6.0_18 
Java home: /usr/lib/jvm/java-6-openjdk/jre 
Default locale: en_GB, platform encoding: UTF-8 
OS name: "linux" version: "2.6.32-25-generic" arch: "i386" Family: "unix" 

$ mvn -e exec:java -Dexec.mainClass="com.stackoverflow.Demo" -Dexec.classpathScope="test" 

[ERROR] BUILD ERROR 
[INFO] ------------------------------------------------------------------------ 
[INFO] An exception occured while executing the Java class. com.stackoverflow.Demo 

[INFO] ------------------------------------------------------------------------ 
[INFO] Trace 
org.apache.maven.lifecycle.LifecycleExecutionException: An exception occured while executing the Java class. com.stackoverflow.Demo 
     at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:719) 
     at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeStandaloneGoal(DefaultLifecycleExecutor.java:569) 
     at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:539) 
     at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:387) 
     at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:348) 
     at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:180) 
     at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:328) 
     at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:138) 
     at org.apache.maven.cli.MavenCli.main(MavenCli.java:362) 
     at org.apache.maven.cli.compat.CompatibleMain.main(CompatibleMain.java:60) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315) 
     at org.codehaus.classworlds.Launcher.launch(Launcher.java:255) 
     at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430) 
     at org.codehaus.classworlds.Launcher.main(Launcher.java:375) 
Caused by: org.apache.maven.plugin.MojoExecutionException: An exception occured while executing the Java class. com.stackoverflow.Demo 
     at org.codehaus.mojo.exec.ExecJavaMojo.execute(ExecJavaMojo.java:346) 
     at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:490) 
     at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:694) 
     ... 17 more 
Caused by: java.lang.ClassNotFoundException: com.stackoverflow.Demo 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:248) 
     at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:284) 
     at java.lang.Thread.run(Thread.java:619) 
+0

क्या आप अपना त्रुटि ट्रेस पोस्ट कर सकते हैं? आपके यहां जो काम है वह मेरे लिए काम करता है। – javamonkey79

+1

मैं मूर्ख हूं, पास्कल काम नहीं करता क्योंकि मैंने संकलन/परीक्षण-संकलन नहीं किया था। मूल उदाहरण के लिए त्रुटि ट्रेस को और अधिक बारीकी से देख रहे हैं। – woddle

उत्तर

18

(...) मुझे आशा है कि यह स्पष्ट रूप से है समझाया।

बुरा नहीं है लेकिन मैं पुन: पेश नहीं कर सकता।

 
$ mvn archetype:generate -DgroupId=com.stackoverflow \ 
         -DartifactId=Q4060613 \ 
         -Dversion=1.0-SNAPSHOT \ 
         -DarchetypeArtifactId=maven-archetype-quickstart 

फिर cd इसे में एड और (src/main/java से कम) एक Dog श्रेणी का निर्माण: मैं एक परियोजना बनाई

$ cd Q4060613 
$ cat > src/main/java/com/stackoverflow/Dog.java 
package com.stackoverflow; 

public class Dog { 
    public String bark() { 
     return "woof!"; 
    } 
} 

और (src/test/java से कम) एक Demo श्रेणी का निर्माण:

$ cat > src/test/java/com/stackoverflow/Demo.java 
package com.stackoverflow; 

public class Demo { 
    public static void main(String[] args) { 
     System.out.println(new Dog().bark()); 
    } 
} 

स्रोत कोड को संकलित करने के बाद, आपके द्वारा प्रदत्त कमांड को चलाने के लिए अपेक्षित कार्य करता है:

 
$ mvn test 
... 
$ mvn exec:java -Dexec.mainClass="com.stackoverflow.Demo" -Dexec.classpathScope="test" 
[INFO] Scanning for projects... 
... 
[INFO] --- exec-maven-plugin:1.2:java (default-cli) @ Q4060613 --- 
woof! 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD SUCCESS 
[INFO] ------------------------------------------------------------------------ 
... 

कुछ और गलत होना चाहिए।

+0

ने कोशिश की और आउटपुट को मेरे मूल प्रश्न में जोड़ा। – woddle

+0

बौना? http://www.urbandictionary.com/define.php?term= बौने गरीब कुत्ते :-) (+1) –

+0

@seanizer: आरओएफएल। मुझे लगता है कि मेरा मतलब छाल था :) –

0

ठीक है, इसके द्वारा काम करने के लिए हर किसी के लिए काम करना मैंने थोड़ा कठिन खोला। कोड इसकी समस्याओं की रिपोर्ट नहीं कर रहा था और मैं स्टैकट्रैस को गलत तरीके से पढ़ रहा था।

यह करता है:

FileInputStream is = new FileInputStream("lib/other-thing.jar"); 

जो असफल रहा था। मैं ट्रंक/src/main/assembly/lib/trunk में symlinked symlink/और अब यह काम करता है। हालांकि सिमलिंक को ठीक करने के लिए एक साफ तरीका हो सकता है।

धन्यवाद चाप।

12

exec-maven-plugin प्लगइन में pom.xml में निम्न पंक्तियां शामिल करें। पोम <classpathScope>test</classpathScope>

प्लगइन खंड की तरह इस

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>exec-maven-plugin</artifactId> 
    <executions> 
     <execution> 
      <id>my-execution</id> 
      <phase>test</phase> 
      <goals> 
       <goal>java</goal> 
      </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <mainClass>com.example.MainClass</mainClass> 
      <classpathScope>test</classpathScope> 
    </configuration> 
</plugin> 

नोट दिखता है: com.example.MainClass युक्त मुख्य विधि वर्ग है।

+0

बहुत सारी सहायक टिप्पणियां: आखिरकार यह मुझे ले जाती है : mvn test-compile exec: java -Dexec.mainClass = "com.stackoverflow.Demo" -Dexec.classpathScope = "test" – Huy

11

मुझे एक ही समस्या का सामना करना पड़ा और इसे समझ लिया गया।

संक्षेप में, कक्षा कोexec:java लक्ष्य से पहले संकलित किया जाना चाहिए। (यह निश्चित रूप से अगर वर्ग पहले से ही अन्य उपयोगकर्ता कार्रवाई से संकलित किया गया है test-compile चरण के बिना काम करता है। ध्यान दें कि Pascal Thivent, his answer में, exec:java से पहले mvn test लागू।)

$ mvn -Dexec.mainClass=... -Dexec.classpathScope=test test-compile exec:java 

यदि आप देखना चाहते हैं अपने आप के लिए यह साबित कर सकते हैं ClassNotFoundException फिर से।

$ mvn -Dexec.mainClass=... -Dexec.classpathScope=test clean exec:java 
संबंधित मुद्दे