This is the mail archive of the
java-patches@sources.redhat.com
mailing list for the Java project.
Patch: gij -jar fixes
- To: java-patches at sources dot redhat dot com
- Subject: Patch: gij -jar fixes
- From: Anthony Green <green at cygnus dot com>
- Date: Sat, 26 Aug 2000 12:21:45 -0700
- Reply-to: green at cygnus dot com
I'm committing the following patch. This finishes off some of the
bits needed to execute jar files. Now we can execute jar files
downloaded directly from the net...
$ gij -jar antlrclasses.jar
ANTLR Parser Generator Version 2.7.0 1989-2000 MageLang's jGuru.com
usage: java antlr.Tool [args] file.g
-o outputDir specify output directory where all output generated.
-debug launch the ParseView debugger upon parser invocation.
-html generate an html file from your grammar (minus actions).
-trace have all rules call traceIn/traceOut.
-traceParser have parser rules call traceIn/traceOut.
-traceLexer have lexer rules call traceIn/traceOut.
-traceTreeParser have tree parser rules call traceIn/traceOut.
error: no grammar file specified
2000-08-26 Anthony Green <green@redhat.com>
* Makefile.in: Rebuilt.
* Makefile.am (java/lang/ClassLoader.h): Make _Jv_RunMain a
friend.
* prims.cc: Include ClassLoader.h.
(_Jv_RunMain): When executing jar files, classpath must be the jar
file only. Lose our reference to the system ClassLoader in order
to get a new one with the correct classpath.
* java/lang/natSystem.cc (init_properties): When executing a jar
file, only use the jar file for java.class.path.
* gnu/gcj/runtime/VMClassLoader.java: Use the canonical file name
for bytecode archives.
* gnu/gcj/runtime/FirstThread.java: Handle case where manifest
exists, but not Main-Class.
Index: libjava//Makefile.am
===================================================================
RCS file: /cvs/java/libgcj/libjava/Makefile.am,v
retrieving revision 1.82
diff -u -p -p -r1.82 Makefile.am
--- Makefile.am 2000/08/22 04:46:50 1.82
+++ Makefile.am 2000/08/26 18:56:10
@@ -225,6 +225,7 @@ $(nat_headers): libgcj.zip
java/lang/ClassLoader.h: java/lang/ClassLoader.class libgcj.zip
$(GCJH) -classpath $(top_builddir) \
-friend 'jclass _Jv_FindClass (_Jv_Utf8Const *name, java::lang::ClassLoader *loader);' \
+ -friend 'void _Jv_RunMain (const char *name, int argc, const char **argv, bool is_jar);' \
$(basename $<)
## Our internal main program needs to be able to create a FirstThread.
Index: libjava//Makefile.in
===================================================================
RCS file: /cvs/java/libgcj/libjava/Makefile.in,v
retrieving revision 1.89
diff -u -p -p -r1.89 Makefile.in
--- Makefile.in 2000/08/22 04:46:50 1.89
+++ Makefile.in 2000/08/26 18:56:10
@@ -115,48 +115,31 @@ here = @here@
libgcj_basedir = @libgcj_basedir@
AUTOMAKE_OPTIONS = foreign no-installinfo
-@TESTSUBDIR_TRUE@SUBDIRS = \
-@TESTSUBDIR_TRUE@$(DIRLTDL) testsuite gcj include
-@TESTSUBDIR_FALSE@SUBDIRS = \
-@TESTSUBDIR_FALSE@$(DIRLTDL) gcj include
-@USE_LIBDIR_TRUE@toolexeclibdir = \
-@USE_LIBDIR_TRUE@$(libdir)$(MULTISUBDIR)
-@USE_LIBDIR_FALSE@toolexeclibdir = \
-@USE_LIBDIR_FALSE@$(toolexecdir)/lib$(MULTISUBDIR)
-@USE_LIBDIR_FALSE@toolexecdir = \
-@USE_LIBDIR_FALSE@$(exec_prefix)/$(target_alias)
+@TESTSUBDIR_TRUE@SUBDIRS = @TESTSUBDIR_TRUE@$(DIRLTDL) testsuite gcj include
+@TESTSUBDIR_FALSE@SUBDIRS = @TESTSUBDIR_FALSE@$(DIRLTDL) gcj include
+@USE_LIBDIR_TRUE@toolexeclibdir = @USE_LIBDIR_TRUE@$(libdir)$(MULTISUBDIR)
+@USE_LIBDIR_FALSE@toolexeclibdir = @USE_LIBDIR_FALSE@$(toolexecdir)/lib$(MULTISUBDIR)
+@USE_LIBDIR_FALSE@toolexecdir = @USE_LIBDIR_FALSE@$(exec_prefix)/$(target_alias)
toolexeclib_LTLIBRARIES = libgcj.la
toolexeclib_DATA = libgcj.spec
data_DATA = libgcj.zip
-@NEEDS_DATA_START_TRUE@toolexeclib_LIBRARIES = \
-@NEEDS_DATA_START_TRUE@libgcjdata.a
-@NEEDS_DATA_START_TRUE@libgcjdata_a_SOURCES = \
-@NEEDS_DATA_START_TRUE@libgcjdata.c
+@NEEDS_DATA_START_TRUE@toolexeclib_LIBRARIES = @NEEDS_DATA_START_TRUE@libgcjdata.a
+@NEEDS_DATA_START_TRUE@libgcjdata_a_SOURCES = @NEEDS_DATA_START_TRUE@libgcjdata.c
-@NATIVE_TRUE@bin_PROGRAMS = \
-@NATIVE_TRUE@jv-convert gij
+@NATIVE_TRUE@bin_PROGRAMS = @NATIVE_TRUE@jv-convert gij
bin_SCRIPTS = addr2name.awk
-@CANADIAN_TRUE@@NULL_TARGET_TRUE@GCJ = \
-@CANADIAN_TRUE@@NULL_TARGET_TRUE@gcj
-@CANADIAN_TRUE@@NULL_TARGET_FALSE@GCJ = \
-@CANADIAN_TRUE@@NULL_TARGET_FALSE@$(target_alias)-gcj
-@CANADIAN_FALSE@GCJ = \
-@CANADIAN_FALSE@$(expanded)/gcj$(EXEEXT) -B$(expanded)/
-@CANADIAN_TRUE@@NULL_TARGET_TRUE@ZIP = \
-@CANADIAN_TRUE@@NULL_TARGET_TRUE@$(MULTIBUILDTOP)../$(COMPPATH)/zip/zip$(EXEEXT)
-@CANADIAN_TRUE@@NULL_TARGET_FALSE@ZIP = \
-@CANADIAN_TRUE@@NULL_TARGET_FALSE@zip
-@CANADIAN_FALSE@ZIP = \
-@CANADIAN_FALSE@$(MULTIBUILDTOP)../$(COMPPATH)/zip/zip$(EXEEXT)
-@CANADIAN_TRUE@GCJH = \
-@CANADIAN_TRUE@gcjh
-@CANADIAN_FALSE@GCJH = \
-@CANADIAN_FALSE@$(MULTIBUILDTOP)../$(COMPPATH)/gcc/gcjh$(EXEEXT)
-@CANADIAN_FALSE@expanded = \
-@CANADIAN_FALSE@`cd $(MULTIBUILDTOP)../$(COMPPATH)/gcc && pwd`
+@CANADIAN_TRUE@@NULL_TARGET_TRUE@GCJ = @CANADIAN_TRUE@@NULL_TARGET_TRUE@gcj
+@CANADIAN_TRUE@@NULL_TARGET_FALSE@GCJ = @CANADIAN_TRUE@@NULL_TARGET_FALSE@$(target_alias)-gcj
+@CANADIAN_FALSE@GCJ = @CANADIAN_FALSE@$(expanded)/gcj$(EXEEXT) -B$(expanded)/
+@CANADIAN_TRUE@@NULL_TARGET_TRUE@ZIP = @CANADIAN_TRUE@@NULL_TARGET_TRUE@$(MULTIBUILDTOP)../$(COMPPATH)/zip/zip$(EXEEXT)
+@CANADIAN_TRUE@@NULL_TARGET_FALSE@ZIP = @CANADIAN_TRUE@@NULL_TARGET_FALSE@zip
+@CANADIAN_FALSE@ZIP = @CANADIAN_FALSE@$(MULTIBUILDTOP)../$(COMPPATH)/zip/zip$(EXEEXT)
+@CANADIAN_TRUE@GCJH = @CANADIAN_TRUE@gcjh
+@CANADIAN_FALSE@GCJH = @CANADIAN_FALSE@$(MULTIBUILDTOP)../$(COMPPATH)/gcc/gcjh$(EXEEXT)
+@CANADIAN_FALSE@expanded = @CANADIAN_FALSE@`cd $(MULTIBUILDTOP)../$(COMPPATH)/gcc && pwd`
GCJCOMPILE = CLASSPATH=$(here) $(LIBTOOL) --mode=compile $(GCJ) -fassume-compiled -L$(here) $(JC1FLAGS) -c
GCJLINK = $(LIBTOOL) --mode=link $(GCJ) -L$(here) $(JC1FLAGS) $(LDFLAGS) -o $@
@@ -170,10 +153,8 @@ WARNINGS = -W -Wall
AM_CXXFLAGS = -fno-rtti -fvtable-thunks -fasynchronous-exceptions \
@LIBGCJ_CXXFLAGS@ @EXCEPTIONSPEC@ $(WARNINGS) -D_GNU_SOURCE
-@USING_GCC_TRUE@AM_CFLAGS = \
-@USING_GCC_TRUE@@LIBGCJ_CFLAGS@ $(WARNINGS)
-@USING_GCC_FALSE@AM_CFLAGS = \
-@USING_GCC_FALSE@@LIBGCJ_CFLAGS@
+@USING_GCC_TRUE@AM_CFLAGS = @USING_GCC_TRUE@@LIBGCJ_CFLAGS@ $(WARNINGS)
+@USING_GCC_FALSE@AM_CFLAGS = @USING_GCC_FALSE@@LIBGCJ_CFLAGS@
JCFLAGS = -g
JC1FLAGS = -g @LIBGCJ_JAVAFLAGS@
@@ -225,8 +206,7 @@ extra_headers = java/lang/Object.h java/
NM = nm
-@NATIVE_TRUE@@MAINTAINER_MODE_TRUE@noinst_PROGRAMS = \
-@NATIVE_TRUE@@MAINTAINER_MODE_TRUE@gen-from-JIS
+@NATIVE_TRUE@@MAINTAINER_MODE_TRUE@noinst_PROGRAMS = @NATIVE_TRUE@@MAINTAINER_MODE_TRUE@gen-from-JIS
CONVERT_DIR = gnu/gcj/convert
@@ -1045,7 +1025,7 @@ libgcj-test.spec.in libgcj.spec.in
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
-TAR = tar
+TAR = gtar
GZIP_ENV = --best
DIST_SUBDIRS = @DIRLTDL@ testsuite gcj include @DIRLTDL@ gcj include
DEP_FILES = .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P \
@@ -1854,7 +1834,7 @@ distdir: $(DISTFILES)
@for file in $(DISTFILES); do \
d=$(srcdir); \
if test -d $$d/$$file; then \
- cp -pr $$/$$file $(distdir)/$$file; \
+ cp -pr $$d/$$file $(distdir)/$$file; \
else \
test -f $(distdir)/$$file \
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
@@ -2088,6 +2068,7 @@ $(nat_headers): libgcj.zip
java/lang/ClassLoader.h: java/lang/ClassLoader.class libgcj.zip
$(GCJH) -classpath $(top_builddir) \
-friend 'jclass _Jv_FindClass (_Jv_Utf8Const *name, java::lang::ClassLoader *loader);' \
+ -friend 'void _Jv_RunMain (const char *name, int argc, const char **argv, bool is_jar);' \
$(basename $<)
gnu/gcj/runtime/FirstThread.h: gnu/gcj/runtime/FirstThread.class libgcj.zip
Index: libjava//prims.cc
===================================================================
RCS file: /cvs/java/libgcj/libjava/prims.cc,v
retrieving revision 1.34
diff -u -p -p -r1.34 prims.cc
--- prims.cc 2000/08/21 06:05:19 1.34
+++ prims.cc 2000/08/26 18:56:14
@@ -47,6 +47,7 @@ details. */
#endif // DISABLE_GETENV_PROPERTIES
#include <java/lang/Class.h>
+#include <java/lang/ClassLoader.h>
#include <java/lang/Runtime.h>
#include <java/lang/String.h>
#include <java/lang/Thread.h>
@@ -906,6 +907,9 @@ _Jv_RunMain (const char *name, int argc,
if (is_jar)
{
+ // name specifies a jar file. We must now extract the
+ // Main-Class attribute from the jar's manifest file. This is
+ // done by gnu.gcj.runtime.FirstThread.main.
_Jv_Jar_Class_Path = strdup (name);
arg_vec = JvConvertArgv (1, &_Jv_Jar_Class_Path);
@@ -915,7 +919,14 @@ _Jv_RunMain (const char *name, int argc,
main_thread->start();
_Jv_ThreadWait ();
+ // FirstThread.main extracts the main class name and stores it
+ // here.
class_name = gnu::gcj::runtime::FirstThread::jarMainClassName;
+
+ // We need a new ClassLoader because the classpath must be the
+ // jar file only. The easiest way to do this is to lose our
+ // reference to the previous classloader.
+ java::lang::ClassLoader::system = NULL;
}
else
class_name = JvNewStringLatin1 (name);
Index: libjava//gcj/Makefile.in
===================================================================
RCS file: /cvs/java/libgcj/libjava/gcj/Makefile.in,v
retrieving revision 1.9
diff -u -p -p -r1.9 Makefile.in
--- Makefile.in 2000/08/22 04:46:50 1.9
+++ Makefile.in 2000/08/26 18:56:14
@@ -129,7 +129,7 @@ DIST_COMMON = Makefile.am Makefile.in
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
-TAR = tar
+TAR = gtar
GZIP_ENV = --best
all: all-redirect
.SUFFIXES:
@@ -198,7 +198,7 @@ distdir: $(DISTFILES)
@for file in $(DISTFILES); do \
d=$(srcdir); \
if test -d $$d/$$file; then \
- cp -pr $$/$$file $(distdir)/$$file; \
+ cp -pr $$d/$$file $(distdir)/$$file; \
else \
test -f $(distdir)/$$file \
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
Index: libjava//gnu/gcj/runtime/FirstThread.java
===================================================================
RCS file: /cvs/java/libgcj/libjava/gnu/gcj/runtime/FirstThread.java,v
retrieving revision 1.4
diff -u -p -p -r1.4 FirstThread.java
--- FirstThread.java 2000/08/21 06:05:19 1.4
+++ FirstThread.java 2000/08/26 18:56:14
@@ -55,11 +55,15 @@ final class FirstThread extends Thread
jarMainClassName = a.getValue(Attributes.Name.MAIN_CLASS);
- } catch (Exception e) {
-
- System.err.println ("Failed to load Main-Class manifest attribute from\n" + args[0]);
+ if (jarMainClassName != null)
+ return;
+ } catch (Exception e) {
+ // empty
}
+
+ System.err.println ("Failed to load Main-Class manifest attribute from\n"
+ + args[0]);
}
// If interpreter is invoked with -jar, the main class name is recorded
Index: libjava//gnu/gcj/runtime/VMClassLoader.java
===================================================================
RCS file: /cvs/java/libgcj/libjava/gnu/gcj/runtime/VMClassLoader.java,v
retrieving revision 1.4
diff -u -p -p -r1.4 VMClassLoader.java
--- VMClassLoader.java 2000/03/07 19:55:25 1.4
+++ VMClassLoader.java 2000/08/26 18:56:14
@@ -34,7 +34,16 @@ final class VMClassLoader extends java.n
try
{
if (e.endsWith(".jar") || e.endsWith (".zip"))
- p.addElement(new URL("jar", "", -1, "file:///"+e+"!/"));
+ {
+ File archive = new File (e);
+ try {
+ p.addElement(new URL("jar", "", -1, "file://"
+ + archive.getCanonicalPath ()
+ + "!/"));
+ } catch (IOException ex) {
+ // empty
+ }
+ }
else if (e.endsWith ("/"))
p.addElement (new URL("file", "", -1, e));
else if (new File (e).isDirectory ())
Index: libjava//include/Makefile.in
===================================================================
RCS file: /cvs/java/libgcj/libjava/include/Makefile.in,v
retrieving revision 1.11
diff -u -p -p -r1.11 Makefile.in
--- Makefile.in 2000/08/22 04:46:50 1.11
+++ Makefile.in 2000/08/26 18:56:14
@@ -128,7 +128,7 @@ DIST_COMMON = ./stamp-h.in Makefile.am
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
-TAR = tar
+TAR = gtar
GZIP_ENV = --best
all: all-redirect
.SUFFIXES:
@@ -225,7 +225,7 @@ distdir: $(DISTFILES)
@for file in $(DISTFILES); do \
d=$(srcdir); \
if test -d $$d/$$file; then \
- cp -pr $$/$$file $(distdir)/$$file; \
+ cp -pr $$d/$$file $(distdir)/$$file; \
else \
test -f $(distdir)/$$file \
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
Index: libjava//java/lang/natSystem.cc
===================================================================
RCS file: /cvs/java/libgcj/libjava/java/lang/natSystem.cc,v
retrieving revision 1.23
diff -u -p -p -r1.23 natSystem.cc
--- natSystem.cc 2000/08/21 06:05:19 1.23
+++ natSystem.cc 2000/08/26 18:56:14
@@ -348,34 +348,31 @@ java::lang::System::init_properties (voi
}
}
- // FIXME: find libgcj.zip and append its path?
- char *classpath = ::getenv("CLASSPATH");
- jstring cp = properties->getProperty (JvNewStringLatin1("java.class.path"));
- java::lang::StringBuffer *sb = new java::lang::StringBuffer ();
-
if (_Jv_Jar_Class_Path)
- {
- sb->append (JvNewStringLatin1 (_Jv_Jar_Class_Path));
-#ifdef WIN32
- sb->append ((jchar) ';');
-#else
- sb->append ((jchar) ':');
-#endif;
- }
- if (classpath)
+ properties->put(JvNewStringLatin1 ("java.class.path"),
+ JvNewStringLatin1 (_Jv_Jar_Class_Path));
+ else
{
- sb->append (JvNewStringLatin1 (classpath));
+ // FIXME: find libgcj.zip and append its path?
+ char *classpath = ::getenv("CLASSPATH");
+ jstring cp = properties->getProperty (JvNewStringLatin1("java.class.path"));
+ java::lang::StringBuffer *sb = new java::lang::StringBuffer ();
+
+ if (classpath)
+ {
+ sb->append (JvNewStringLatin1 (classpath));
#ifdef WIN32
- sb->append ((jchar) ';');
+ sb->append ((jchar) ';');
#else
- sb->append ((jchar) ':');
+ sb->append ((jchar) ':');
#endif;
+ }
+ if (cp != NULL)
+ sb->append (cp);
+ else
+ sb->append ((jchar) '.');
+
+ properties->put(JvNewStringLatin1 ("java.class.path"),
+ sb->toString ());
}
- if (cp != NULL)
- sb->append (cp);
- else
- sb->append ((jchar) '.');
-
- properties->put(JvNewStringLatin1 ("java.class.path"),
- sb->toString ());
}
Index: libjava//testsuite/Makefile.in
===================================================================
RCS file: /cvs/java/libgcj/libjava/testsuite/Makefile.in,v
retrieving revision 1.21
diff -u -p -p -r1.21 Makefile.in
--- Makefile.in 2000/08/22 04:46:51 1.21
+++ Makefile.in 2000/08/26 18:56:14
@@ -137,7 +137,7 @@ DIST_COMMON = ChangeLog Makefile.am Mak
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
-TAR = tar
+TAR = gtar
GZIP_ENV = --best
all: all-redirect
.SUFFIXES:
@@ -165,7 +165,7 @@ distdir: $(DISTFILES)
@for file in $(DISTFILES); do \
d=$(srcdir); \
if test -d $$d/$$file; then \
- cp -pr $$/$$file $(distdir)/$$file; \
+ cp -pr $$d/$$file $(distdir)/$$file; \
else \
test -f $(distdir)/$$file \
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
AG
--
Anthony Green Red Hat
Sunnyvale, California