2014-05-10 2 views
0

maven을 사용하여 osx에서 swt를 테스트하려는 샘플 애플리케이션을 만들었습니다. 수백 개의 기사를 읽고 기본 스레드에서 디스플레이를 만들었지 만 앱에서 같은 예외가 발생합니다.Maven을 사용하는 OSX에서 SWT 오류

내 pom 파일과 my sample application을 확인할 수 있습니까?

의 pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>asdf.abcd</groupId> 
    <artifactId>b</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <name>example</name> 

    <dependencies> 
     <dependency> 
      <groupId>org.eclipse.swt</groupId> 
      <artifactId>org.eclipse.swt.cocoa.macosx.x86_64</artifactId> 
      <version>4.3</version> 
     </dependency> 
     <dependency> 
      <groupId>org.eclipse.jface</groupId> 
      <artifactId>jface</artifactId> 
      <version>3.9.1</version> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 

       <groupId>org.codehaus.mojo</groupId> 
       <artifactId>exec-maven-plugin</artifactId> 
       <version>1.2.1</version> 
       <executions> 
        <execution> 
         <goals> 
          <goal>java</goal> 
         </goals> 
        </execution> 
       </executions> 
       <configuration> 
        <arguments> 
         <argument>-d64</argument> 
         <argument>-XstartOnFirstThread</argument> 
         <argument>-classpath</argument> 
        </arguments> 
        <mainClass>standalone.App</mainClass> 
        <addClasspath>true</addClasspath> 
       </configuration> 
      </plugin> 

      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-jar-plugin</artifactId> 
       <configuration> 
        <archive> 
         <manifest> 
          <mainClass>standalone.App</mainClass> 
         </manifest> 
        </archive> 
       </configuration> 
      </plugin> 
     </plugins> 

    </build> 

</project> 

예외 : 아이디어와 시간에 대한

###Thread name: standalone.App.main() Thread[standalone.App.main(),5,standalone.App] <-- debug message 


***WARNING: Display must be created on main thread due to Cocoa restrictions. 
[WARNING] 
java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:297) 
    at java.lang.Thread.run(Thread.java:744) 
Caused by: org.eclipse.swt.SWTException: Invalid thread access 
    at org.eclipse.swt.SWT.error(Unknown Source) 
    at org.eclipse.swt.SWT.error(Unknown Source) 
    at org.eclipse.swt.SWT.error(Unknown Source) 
    at org.eclipse.swt.widgets.Display.error(Unknown Source) 
    at org.eclipse.swt.widgets.Display.createDisplay(Unknown Source) 
    at org.eclipse.swt.widgets.Display.create(Unknown Source) 
    at org.eclipse.swt.graphics.Device.<init>(Unknown Source) 
    at org.eclipse.swt.widgets.Display.<init>(Unknown Source) 
    at org.eclipse.swt.widgets.Display.<init>(Unknown Source) 
    at org.eclipse.swt.widgets.Display.getDefault(Unknown Source) 
    at standalone.App.main(App.java:66) 
    ... 6 more 

감사합니다!

답변

1

가. 그게 당신이 할 수없는 의미 -XstartOnFirstThread 옵션을 지정해야합니다 새 JVM이 작성되지 않아서 앱이 시작될 때 JVM 인수를 전달하십시오. 메이븐을 실행하는 (따라서도 결국 앱이 실행되는)이 JVM에

1 패스 JVM 인수 :

당신은 두 가지 옵션이 있습니다. 맥에서이가 MAVEN_OPTS 환경 변수를 설정하여 수행됩니다 :이 경우

export MAVEN_OPTS="-XstartOnFirstThread` 
(then run Maven) 

당신은 제거 할 수있는 모든 <configuration> 섹션에서 <arguments>가 불필요하고 아무런 효과가 없기 때문에. <addClasspath>을 삭제할 수도 있습니다. 당신은 모든 일을해야합니까이 경우

<goals> 
    <goal>exec</goal> 
</goals> 

: 일반 쉘 명령으로 java를 실행하고 모든 JVM 구성 인수 당신이 원하는 전달할 수

2. 사용 <goal>exec</goal> 실제 주 클래스뿐만 아니라 <arguments>에 있습니다. JVM이 쉘 명령으로 실행되는 또 다른 인수이기 때문입니다. 당신은 또한 약간 간단한 방법으로 클래스 경로를 추가 할 수 있습니다 : 당신이 메이븐 앱을 실행하기 전에 JVM에 이상한 일을 처리하지 않기 때문에

<executable>java</executable> 
<arguments> 
    <argument>-XstartOnFirstThread</argument> 
    <argument>-classpath</argument> 
    <classpath/> 
    <argument>standalone.App</argument> 
</arguments> 

이 두 번째 옵션은 일반적으로 더 강력합니다.

2

당신은 당신이 맥 OS X의 상 SWT 응용 프로그램을 실행할 때 메이븐가 실행되는 동일한 JVM에서 응용 프로그램을 실행 <goal>java</goal>을 사용하는

+0

답변 주셔서 감사합니다. Greg. pom.xml에 지정했습니다. mvn exec : java exec-maven-plugin 명령을 실행하면 XstartOnFirstThread 인수로 앱이 실행됩니다. 예외 첫 줄에서 앱이 주 스레드에서 실행되는 것을 볼 수 있습니다. 스레드 이름을 출력했습니다. – flatronka

+0

SWT가 보지 않는 것이 아니라면,'NSThread.isMainThread()'가 false를 반환하기 때문에 오류 메시지가 출력됩니다. –

+0

그렉에 감사드립니다! 나는 그것이 어떻게 가능한지 모른다. – flatronka

관련 문제