2012-12-18 3 views
2

다음 코드는 JDK7을 사용하는 Eclipse에서 아무런 문제없이 컴파일되지만 (업데이트 10을 사용하지만 모든 JDK7 버전에서 재현 가능해야 함) 명령 행을 통해 컴파일 할 때 오류가 발생하지 않습니다. 같은 JDK. 이 클래스는 인터페이스 메소드의 스텁 구현만을 제공합니다.코드 Eclipse에서는 컴파일되지만 명령 프롬프트에서는 컴파일되지 않습니다.

import java.io.File; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.URL; 
import java.security.cert.X509Certificate; 
import java.util.Dictionary; 
import java.util.Enumeration; 
import java.util.List; 
import java.util.Map; 

import org.osgi.framework.Bundle; 
import org.osgi.framework.BundleContext; 
import org.osgi.framework.BundleException; 
import org.osgi.framework.ServiceReference; 
import org.osgi.framework.Version; 


public class TestBundle implements Bundle { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 


    } 

    @Override 
    public int compareTo(Bundle o) { 

     return 0; 
    } 

    @Override 
    public <A> A adapt(Class<A> arg0) { 

     return null; 
    } 

    @Override 
    public Enumeration<URL> findEntries(String arg0, String arg1, boolean arg2) { 

     return null; 
    } 

    @Override 
    public BundleContext getBundleContext() { 

     return null; 
    } 

    @Override 
    public long getBundleId() { 

     return 0; 
    } 

    @Override 
    public File getDataFile(String arg0) { 

     return null; 
    } 

    @Override 
    public URL getEntry(String arg0) { 

     return null; 
    } 

    @Override 
    public Enumeration<String> getEntryPaths(String arg0) { 

     return null; 
    } 

    @Override 
    public Dictionary<String, String> getHeaders() { 

     return null; 
    } 

    @Override 
    public Dictionary<String, String> getHeaders(String arg0) { 

     return null; 
    } 

    @Override 
    public long getLastModified() { 

     return 0; 
    } 

    @Override 
    public String getLocation() { 

     return null; 
    } 

    @Override 
    public ServiceReference<?>[] getRegisteredServices() { 

     return null; 
    } 

    @Override 
    public URL getResource(String arg0) { 

     return null; 
    } 

    @Override 
    public Enumeration<URL> getResources(String arg0) throws IOException { 

     return null; 
    } 

    @Override 
    public ServiceReference<?>[] getServicesInUse() { 

     return null; 
    } 

    @Override 
    public Map<X509Certificate, List<X509Certificate>> getSignerCertificates(
      int arg0) { 

     return null; 
    } 

    @Override 
    public int getState() { 

     return 0; 
    } 

    @Override 
    public String getSymbolicName() { 

     return null; 
    } 

    @Override 
    public Version getVersion() { 

     return null; 
    } 

    @Override 
    public boolean hasPermission(Object arg0) { 

     return false; 
    } 

    @Override 
    public Class<?> loadClass(String arg0) throws ClassNotFoundException { 

     return null; 
    } 

    @Override 
    public void start() throws BundleException { 


    } 

    @Override 
    public void start(int arg0) throws BundleException { 


    } 

    @Override 
    public void stop() throws BundleException { 


    } 

    @Override 
    public void stop(int arg0) throws BundleException { 


    } 

    @Override 
    public void uninstall() throws BundleException { 


    } 

    @Override 
    public void update() throws BundleException { 


    } 

    @Override 
    public void update(InputStream arg0) throws BundleException { 


    } 

} 

OSGI의 JAR 파일은 내가 명령 줄을 통해이을 컴파일하려면 다음 명령을 사용하고 here

에서 다운로드 할 수 있습니다

javac.exe -cp org.eclipse.osgi_3.8.0.v20120529-1548.jar TestBundle.java 

이 제공 명령 줄을 통해 컴파일 할 때 오류 다음 :

TestBundle.java:101: error: type ServiceReference does not take parameters 
     public ServiceReference<?>[] getRegisteredServices() { 
          ^
TestBundle.java:119: error: type ServiceReference does not take parameters 
     public ServiceReference<?>[] getServicesInUse() { 
          ^
TestBundle.java:18: error: TestBundle is not abstract and does not override abstract method adapt(Class) in Bundle 
public class TestBundle implements Bundle { 
    ^
TestBundle.java:28: error: method does not override or implement a method from a supertype 
     @Override 
     ^
TestBundle.java:35: error: name clash: <A>adapt(Class<A>) in TestBundle and adapt(Class) in Bundle have the same erasure, yet neither overrides the other 
     public <A> A adapt(Class<A> arg0) { 
        ^
    where A is a type-variable: 
    A extends Object declared in method <A>adapt(Class<A>) 
TestBundle.java:34: error: method does not override or implement a method from a supertype 
     @Override 
     ^
6 errors 
+0

당신은 이클립스 프로젝트 디렉토리에있는 .classpath 파일을 확인 했습니까? 그것은 당신에게 당신의 클래스 패스에 포함될 모든 jar 파일을 제공합니다. –

+0

@BhavikShah : 예. 여기에는 JDK 및 위에서 언급 한 jar 파일에 대한 항목 만 들어 있습니다. – Manish

답변

10

을 위해 노력하고 있습니다 TestBundle.java은 OSGi 스펙 번들이 문제 Java 7에서 컴파일되었습니다. 이것은 jdk 1.4에 대한 이전 버전과의 호환성을 가지고 컴파일 된 번들이므로 JDK 7에서 중단됩니다. 새로운 버전이 jdk 7을 준수하는 것으로 발표되었습니다.

4.3.1 소스는 4.3.0과 동일합니다. 그냥 다시 컴파일됩니다. 이 jar로 코드를 컴파일 할 수 있어야합니다. 나는 이것이 당신이 사용했던 일식에서 jar와 어떻게 관련이 있는지 모르겠다. 그러나 그들은 단지 오래된 컴파일 된 spec 클래스를 사용했다고 생각한다.

http://search.maven.org/remotecontent?filepath=org/osgi/org.osgi.core/4.3.1/org.osgi.core-4.3.1.jar

+0

http : //blog.osgi를 참조하십시오.org/2012/10/43-companion-code-for-java-7.html –

+0

Eclipse에서 javac 대신 JDT 컴파일러를 사용하기 때문에 "이 위 코드가 Eclipse에서 컴파일되는 이유"가이 답변에 추가됩니다. – Manish

0

코드를 컴파일 할 수있었습니다. 을 사용하여 javac * 에서 명령 줄 *을 삭제 한 후에 다른 항목을 제거하고 클래스와 패키지 만 보관하면됩니다. jar의 정리 된 버전은 here입니다.

또한 이클립스에서 일반적으로 소개되는 @Override 주석을 제거했습니다.

+0

그래, 우리는 항아리를 조정하여 작동하게 만들 수 있지만 질문은 그것이 그대로 작동하지 않는 이유입니다. @Override에 대해서는 그 유용함이 유용하며 가능할 때마다 사용해야합니다. http://stackoverflow.com/questions/94361/when-do-you-use-javas-override-annotation-and-why – Manish

+0

@ Oververride 오용과 관련된 문제가 있습니다. 그것은 종종 전통적인 방식으로 메소드를 오버라이드하지 않았기 때문에 (실제로 구현하고 오버라이드하지 않는 클래스에서 인터페이스 메소드를 구현하므로) 컴파일러가 불평합니다. – Amber

+0

항아리로 조정할 때 항아리 내부에 이상이 있음을 알게되면 문제를 쉽게 좁힐 수 있습니다. 나 맞아 ? – Amber

0

당신은 잘못된 jar 파일의 이름을 언급 - "org.eclipse.osgi_3.8.0.v20120529-1548.jar" 올바른 파일 이름이 org.eclipse.osgi-3.8.0.v20120529-1548.jar입니다

이 명령 : 제네릭 때와 javac.exe -cp org.eclipse.osgi-3.8.0.v20120529-1548.jar

+0

어떤 JDK 버전을 사용하고 있습니까? – Manish

+0

JDK 버전 1.7 –

관련 문제