From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28594 invoked by alias); 3 Jun 2007 20:30:35 -0000 Received: (qmail 28576 invoked by uid 48); 3 Jun 2007 20:30:34 -0000 Date: Sun, 03 Jun 2007 20:30:00 -0000 Subject: [Bug libgcj/32198] New: rmic fails if remote method throws superclass of RemoteException X-Bugzilla-Reason: CC Message-ID: Reply-To: gcc-bugzilla@gcc.gnu.org To: java-prs@gcc.gnu.org From: "marcus at better dot se" Mailing-List: contact java-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: java-prs-owner@gcc.gnu.org X-SW-Source: 2007-q2/txt/msg00150.txt.bz2 GCJ fails to build MX4J [1], whereas it works with Sun JDK 5. This is because rmic cannot compile a remote object with a method that only declares that it throws an exception that is a superclass of RemoteException. This should be allowed though: "Each remote method must declare java.rmi.RemoteException (or a superclass of RemoteException) in its throws clause, in addition to any application-specific exceptions." [2] Build output: rmic.iiop: [rmic] javax/management/remote/rmi/RMIServerImpl.class added as javax/management/remote/rmi/_RMIServerImpl_Tie.class doesn't exist. [rmic] RMI Compiling 1 class to /home/marcus/src/debian/build-area/libmx4j-java-3.0.2/classes/core [rmic] Using SUN rmic compiler [rmic] IIOP has been turned on. [rmic] Compilation arguments: [rmic] '-d' [rmic] '/home/marcus/src/debian/build-area/libmx4j-java-3.0.2/classes/core' [rmic] '-classpath' [rmic] '/home/marcus/src/debian/build-area/libmx4j-java-3.0.2/classes/core:/home/marcus/src/debian/build-area/libmx4j-java-3.0.2/lib:/home/marcus/src/debian/build-area/libmx4j-java-3.0.2/dist/lib/mx4j-impl.jar:/home/marcus/src/debian/build-area/libmx4j-java-3.0.2/dist/lib/mx4j-jmx.jar:/home/marcus/src/debian/build-area/libmx4j-java-3.0.2/dist/lib/mx4j.jar:/usr/share/ant/lib/ant.jar:/usr/share/ant/lib/ant-launcher.jar:/usr/share/java/log4j-1.2.jar:/usr/share/java/commons-logging.jar:/usr/share/java/servlet-api-2.4.jar:/usr/share/java/bcel.jar:/usr/share/java/jython.jar:/usr/share/java/gnumail.jar:/usr/share/java/activation.jar:/usr/share/java/axis.jar:/usr/share/java/jaxrpc.jar:/usr/share/java/saaj.jar:/usr/lib/jvm/java-gcj/lib/tools.jar' [rmic] '-iiop' [rmic] '-g' [rmic] [rmic] The ' characters around the executable and arguments are [rmic] not part of the command. [rmic] File to be compiled: javax.management.remote.rmi.RMIServerImpl [antcall] Exiting /home/marcus/src/debian/build-area/libmx4j-java-3.0.2/build/build.xml. BUILD FAILED /home/marcus/src/debian/build-area/libmx4j-java-3.0.2/build/build.xml:287: The following error occurred while executing this line: /home/marcus/src/debian/build-area/libmx4j-java-3.0.2/build/build.xml:257: Error starting SUN rmic: at org.apache.tools.ant.ProjectHelper.addLocationToBuildException(ProjectHelper.java:539) at org.apache.tools.ant.taskdefs.Ant.execute(Ant.java:385) at org.apache.tools.ant.taskdefs.CallTarget.execute(CallTarget.java:107) at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:275) at org.apache.tools.ant.Task.perform(Task.java:364) at org.apache.tools.ant.Target.execute(Target.java:341) at org.apache.tools.ant.Target.performTasks(Target.java:369) at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1216) at org.apache.tools.ant.Project.executeTarget(Project.java:1185) at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:40) at org.apache.tools.ant.Project.executeTargets(Project.java:1068) at org.apache.tools.ant.Main.runBuild(Main.java:668) at org.apache.tools.ant.Main.startAnt(Main.java:187) at org.apache.tools.ant.Main.start(Main.java:150) at org.apache.tools.ant.Main.main(Main.java:240) Caused by: /home/marcus/src/debian/build-area/libmx4j-java-3.0.2/build/build.xml:257: Error starting SUN rmic: at org.apache.tools.ant.taskdefs.rmic.SunRmic.execute(SunRmic.java:67) at org.apache.tools.ant.taskdefs.Rmic.execute(Rmic.java:529) at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:275) at org.apache.tools.ant.Task.perform(Task.java:364) at org.apache.tools.ant.Target.execute(Target.java:341) at org.apache.tools.ant.Target.performTasks(Target.java:369) at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1216) at org.apache.tools.ant.helper.SingleCheckExecutor.executeTargets(SingleCheckExecutor.java:37) at org.apache.tools.ant.Project.executeTargets(Project.java:1068) at org.apache.tools.ant.taskdefs.Ant.execute(Ant.java:382) ...13 more Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke(libgcj.so.71) at org.apache.tools.ant.taskdefs.rmic.SunRmic.execute(SunRmic.java:54) ...22 more Caused by: gnu.classpath.tools.rmic.CompilationError: newClient, defined in javax.management.remote.rmi.RMIServer, does not throw java.rmi.RemoteException at gnu.classpath.tools.rmic.SourceGiopRmicCompiler.compile(SourceGiopRmicCompiler.java:302) at gnu.classpath.tools.rmic.SourceGiopRmicCompiler.run(SourceGiopRmicCompiler.java:661) at gnu.classpath.tools.rmic.Main.run(Main.java:259) at gnu.classpath.tools.rmic.Main.main(Main.java:272) at sun.rmi.rmic.Main.compile(Main.java:51) at java.lang.reflect.Method.invoke(libgcj.so.71) ...23 more --- Nested Exception --- /home/marcus/src/debian/build-area/libmx4j-java-3.0.2/build/build.xml:257: Error starting SUN rmic: at org.apache.tools.ant.taskdefs.rmic.SunRmic.execute(SunRmic.java:67) at org.apache.tools.ant.taskdefs.Rmic.execute(Rmic.java:529) at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:275) at org.apache.tools.ant.Task.perform(Task.java:364) at org.apache.tools.ant.Target.execute(Target.java:341) at org.apache.tools.ant.Target.performTasks(Target.java:369) at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1216) at org.apache.tools.ant.helper.SingleCheckExecutor.executeTargets(SingleCheckExecutor.java:37) at org.apache.tools.ant.Project.executeTargets(Project.java:1068) at org.apache.tools.ant.taskdefs.Ant.execute(Ant.java:382) at org.apache.tools.ant.taskdefs.CallTarget.execute(CallTarget.java:107) at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:275) at org.apache.tools.ant.Task.perform(Task.java:364) at org.apache.tools.ant.Target.execute(Target.java:341) at org.apache.tools.ant.Target.performTasks(Target.java:369) at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1216) at org.apache.tools.ant.Project.executeTarget(Project.java:1185) at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:40) at org.apache.tools.ant.Project.executeTargets(Project.java:1068) at org.apache.tools.ant.Main.runBuild(Main.java:668) at org.apache.tools.ant.Main.startAnt(Main.java:187) at org.apache.tools.ant.Main.start(Main.java:150) at org.apache.tools.ant.Main.main(Main.java:240) Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke(libgcj.so.71) at org.apache.tools.ant.taskdefs.rmic.SunRmic.execute(SunRmic.java:54) ...22 more Caused by: gnu.classpath.tools.rmic.CompilationError: newClient, defined in javax.management.remote.rmi.RMIServer, does not throw java.rmi.RemoteException at gnu.classpath.tools.rmic.SourceGiopRmicCompiler.compile(SourceGiopRmicCompiler.java:302) at gnu.classpath.tools.rmic.SourceGiopRmicCompiler.run(SourceGiopRmicCompiler.java:661) at gnu.classpath.tools.rmic.Main.run(Main.java:259) at gnu.classpath.tools.rmic.Main.main(Main.java:272) at sun.rmi.rmic.Main.compile(Main.java:51) at java.lang.reflect.Method.invoke(libgcj.so.71) ...23 more --- Nested Exception --- java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke(libgcj.so.71) at org.apache.tools.ant.taskdefs.rmic.SunRmic.execute(SunRmic.java:54) at org.apache.tools.ant.taskdefs.Rmic.execute(Rmic.java:529) at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:275) at org.apache.tools.ant.Task.perform(Task.java:364) at org.apache.tools.ant.Target.execute(Target.java:341) at org.apache.tools.ant.Target.performTasks(Target.java:369) at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1216) at org.apache.tools.ant.helper.SingleCheckExecutor.executeTargets(SingleCheckExecutor.java:37) at org.apache.tools.ant.Project.executeTargets(Project.java:1068) at org.apache.tools.ant.taskdefs.Ant.execute(Ant.java:382) at org.apache.tools.ant.taskdefs.CallTarget.execute(CallTarget.java:107) at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:275) at org.apache.tools.ant.Task.perform(Task.java:364) at org.apache.tools.ant.Target.execute(Target.java:341) at org.apache.tools.ant.Target.performTasks(Target.java:369) at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1216) at org.apache.tools.ant.Project.executeTarget(Project.java:1185) at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:40) at org.apache.tools.ant.Project.executeTargets(Project.java:1068) at org.apache.tools.ant.Main.runBuild(Main.java:668) at org.apache.tools.ant.Main.startAnt(Main.java:187) at org.apache.tools.ant.Main.start(Main.java:150) at org.apache.tools.ant.Main.main(Main.java:240) Caused by: gnu.classpath.tools.rmic.CompilationError: newClient, defined in javax.management.remote.rmi.RMIServer, does not throw java.rmi.RemoteException at gnu.classpath.tools.rmic.SourceGiopRmicCompiler.compile(SourceGiopRmicCompiler.java:302) at gnu.classpath.tools.rmic.SourceGiopRmicCompiler.run(SourceGiopRmicCompiler.java:661) at gnu.classpath.tools.rmic.Main.run(Main.java:259) at gnu.classpath.tools.rmic.Main.main(Main.java:272) at sun.rmi.rmic.Main.compile(Main.java:51) at java.lang.reflect.Method.invoke(libgcj.so.71) ...23 more The remote interface in question, RMIServer, has the following definition: public interface RMIServer extends Remote { public String getVersion() throws RemoteException; public RMIConnection newClient(Object credentials) throws IOException, SecurityException; } Note that newClient throws IOException, a superclass of RemoteException. The bug seems to be in gcj's SourceGiopRmicCompiler.compile() method [3]: Class c = (Class) iter.next(); Method[] m = c.getMethods(); // Check if throws RemoteException. for (int i = 0; i < m.length; i++) { Class[] exc = m[i].getExceptionTypes(); boolean remEx = false; for (int j = 0; j < exc.length; j++) { if (RemoteException.class.isAssignableFrom(exc[j])) { remEx = true; break; } } if (! remEx && !force) throw new CompilationError(m[i].getName() + ", defined in " + c.getName() + ", does not throw " + RemoteException.class.getName()); AbstractMethodGenerator mm = createMethodGenerator(m[i]); methods.add(mm); } This code checks that the declared exception exc[j] is a _subclass_ of RemoteException, when it seems that it should do exactly the opposite! [1] http://mx4j.sourceforge.net/ [2] http://java.sun.com/j2se/1.5.0/docs/guide/rmi/hello/hello-world.html [3] http://gcc.gnu.org/viewcvs/trunk/libjava/classpath/tools/gnu/classpath/tools/rmic/SourceGiopRmicCompiler.java?revision=120621&view=markup -- Summary: rmic fails if remote method throws superclass of RemoteException Product: gcc Version: 4.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libgcj AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: marcus at better dot se http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32198