2014-02-24 2 views
0

maven을 사용하는 테스트로 프로젝트를 빌드하는 데 문제가 있습니다. 그것은 프로젝트 자체에 대해서만 잘 작동합니다. 그리고 나는이 문제를 2 주 전에하지 못했기 때문에 그것을 소개 한 것도 정말로 확신 할 수 없다.테스트를 실행하는 동안 Maven 스레드가 영원히 기다림

대기중인 스레드의 스택 추적이 있습니다. 나는 같은 결과로 maven-2.0.11과 3.0.4로 빌드를 시도했다.

"main" prio=5 tid=7fb301801000 nid=0x10e6d9000 in Object.wait() [10e6d7000] 
    java.lang.Thread.State: WAITING (on object monitor) 
    at java.lang.Object.wait(Native Method) 
    - waiting on <7f3078728> (a java.lang.UNIXProcess) 
    at java.lang.Object.wait(Object.java:485) 
    at java.lang.UNIXProcess.waitFor(UNIXProcess.java:115) 
    - locked <7f3078728> (a java.lang.UNIXProcess) 
    at org.codehaus.plexus.util.cli.CommandLineUtils.executeCommandLine(CommandLineUtils.java:151) 
    at org.codehaus.plexus.util.cli.CommandLineUtils.executeCommandLine(CommandLineUtils.java:88) 
    at org.apache.maven.plugin.surefire.booterclient.ForkStarter.fork(ForkStarter.java:191) 
    at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:98) 
    at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeProvider(AbstractSurefireMojo.java:200) 
    at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAllProviders(AbstractSurefireMojo.java:177) 
    at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:135) 
    at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.java:98) 
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101) 
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209) 
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) 
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) 
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84) 
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59) 
    at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183) 
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161) 
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320) 
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156) 
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537) 
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196) 
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:141) 
    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.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352) 

누구든지이 문제를 해결하거나 해결할 아이디어가 있습니까?

+0

어떤 테스트를 실행하려고하는지 알고 있습니까? 테스트를 건너 뛰면 실행됩니까? 나는 디버깅을 할 것입니다. –

+0

저는 Junits를 실행하고 있습니다. skip.tests = true로 실행하면 빌드가 성공하지만 테스트를 통과해야합니다. –

+0

좋아, 내가 제안한 다른 것들도해라. 나는 * one * 테스트가 블로킹으로 인해이 문제를 일으키는 것으로 의심합니다. 너는 그것을 좁혀 야한다. –

답변

0

실행 중에 테스트가 중단 될 수 있습니다.

surefire 플러그인의 debugForkedProcess 옵션을 사용해 볼 수 있습니다. 다음과 같이 구성하십시오.

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.16</version> 
    <configuration> 
     <debugForkedProcess>true</debugForkedProcess> 
    </configuration> 
</plugin> 

그런 다음 유닛 테스트 코드에 중단 점을 넣고 디버거를 연결하십시오.

또 다른 옵션은 테스트에 시간 초과를 추가하는 것입니다. JUnit 4에서는 들어, 다음을 추가

@Test(timeout=10000) 
public void testMe() 
{ 
    ... 
} 

당신은 또한 suggested here으로 전 세계적으로이 작업을 수행 할 수 있습니다

@Rule 
public Timeout globalTimeout = new Timeout(10000); 

을 테스트 중 하나 이상이 갇히지하는 경우 그런 다음 테스트 실패에서 볼 수 있으며, 일어나고있는 곳에서 정확하게 작업하십시오. 테스트가 @Before 또는 @After에 걸리면 시간 제한이 적용되지 않을 수 있습니다.