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