From 40e12efe45720fbd91e460a595ce6f8ff0d9177b Mon Sep 17 00:00:00 2001 From: joey Date: Sat, 15 Feb 2003 20:46:09 +0000 Subject: [PATCH] * Corrected precidence problem that made alien not catch mkdir of the work directory failing if the directory already existed (and let it delete the existing directory). Closes: #181061 * Fixed several other instances of the same precidence problem in the code. --- Alien/Package.pm | 4 +- Alien/Package/Deb.pm | 10 +- Alien/Package/Pkg.pm | 22 +-- Alien/Package/Rpm.pm | 8 +- Alien/Package/Slp.pm | 4 +- Alien/Package/Tgz.pm | 9 +- alien.pl | 2 +- debian/changelog | 15 ++ patches/j2sdk_1.4.1_01-4.diff | 320 ++++++++++++++++++++++++++++++++++ 9 files changed, 365 insertions(+), 29 deletions(-) create mode 100644 patches/j2sdk_1.4.1_01-4.diff diff --git a/Alien/Package.pm b/Alien/Package.pm index 7dbec40..e914fe8 100644 --- a/Alien/Package.pm +++ b/Alien/Package.pm @@ -260,7 +260,7 @@ sub unpack { my $this=shift; my $workdir = $this->name."-".$this->version; - mkdir $workdir, 0755 || + mkdir($workdir, 0755) || die "unable to mkdir $workdir: $!"; # If the parent directory is suid/sgid, mkdir will make the root # directory of the package inherit those bits. That is a bad thing, @@ -327,7 +327,7 @@ sub DESTROY { if ($this->unpacked_tree eq '/') { die "alien internal error: unpacked_tree is set to `/'. Please file a bug report!"; } - system('rm', '-rf', $this->unpacked_tree) == 0 + (system('rm', '-rf', $this->unpacked_tree) == 0) or die "unable to delete temporary directory `".$this->unpacked_tree."`: $!"; $this->unpacked_tree(''); } diff --git a/Alien/Package/Deb.pm b/Alien/Package/Deb.pm index 7188601..7e8fd5a 100644 --- a/Alien/Package/Deb.pm +++ b/Alien/Package/Deb.pm @@ -87,7 +87,7 @@ sub install { my $this=shift; my $deb=shift; - system("dpkg", "--no-force-overwrite", "-i", $deb) == 0 + (system("dpkg", "--no-force-overwrite", "-i", $deb) == 0) or die "Unable to install"; } @@ -237,11 +237,11 @@ sub unpack { my $file=$this->filename; if ($this->have_dpkg_deb) { - system("dpkg-deb", "-x", $file, $this->unpacked_tree) == 0 + (system("dpkg-deb", "-x", $file, $this->unpacked_tree) == 0) or die "Unpacking of `$file' failed: $!"; } else { - system("ar -p $file data.tar.gz | gzip -dc | (cd ".$this->unpacked_tree."; tar xpf -)") == 0 + (system("ar -p $file data.tar.gz | gzip -dc | (cd ".$this->unpacked_tree."; tar xpf -)") == 0) or die "Unpacking of `$file' failed: $!"; } @@ -293,14 +293,14 @@ sub prep { my $this=shift; my $dir=$this->unpacked_tree || die "The package must be unpacked first!"; - mkdir "$dir/debian", 0755 || + mkdir("$dir/debian", 0755) || die "mkdir $dir/debian failed: $!"; # Use a patch file to debianize? if (defined $this->patchfile) { # The -f passed to zcat makes it pass uncompressed files # through without error. - system("zcat -f ".$this->patchfile." | (cd $dir; patch -p1)") == 0 + (system("zcat -f ".$this->patchfile." | (cd $dir; patch -p1)") == 0) or die "patch error: $!"; # Look for .rej files. die "patch failed with .rej files; giving up" diff --git a/Alien/Package/Pkg.pm b/Alien/Package/Pkg.pm index 34e37d0..daa5b0b 100644 --- a/Alien/Package/Pkg.pm +++ b/Alien/Package/Pkg.pm @@ -104,7 +104,7 @@ sub install { my $pkg=shift; if (-x "/usr/sbin/pkgadd") { - system("/usr/sbin/pkgadd", "-d .", "$pkg") == 0 + (system("/usr/sbin/pkgadd", "-d .", "$pkg") == 0) or die "Unable to install"; } else { @@ -124,7 +124,7 @@ sub scan { my $file=$this->filename; my $tdir="pkg-scan-tmp.$$"; - mkdir $tdir, 0755 || die "Error making $tdir: $!\n"; + mkdir($tdir, 0755) || die "Error making $tdir: $!\n"; my $pkgname; if (-x "/usr/bin/pkginfo" && -x "/usr/bin/pkgtrans") { @@ -137,7 +137,7 @@ sub scan { close INFO; # Extract the files - system("/usr/bin/pkgtrans -i $file $tdir $pkgname") == 0 + (system("/usr/bin/pkgtrans -i $file $tdir $pkgname") == 0) || die "Error running pkgtrans: $!\n"; open(INFO, "$tdir/$pkgname/pkginfo") @@ -230,13 +230,13 @@ sub unpack { if (-x "/usr/bin/pkgtrans") { my $workdir = $this->name."-".$this->version;; - mkdir $workdir, 0755 || die "unable to mkdir $workdir: $!\n"; - system("/usr/bin/pkgtrans $file $workdir $pkgname") == 0 + mkdir($workdir, 0755) || die "unable to mkdir $workdir: $!\n"; + (system("/usr/bin/pkgtrans $file $workdir $pkgname") == 0) || die "unable to extract $file: $!\n"; - rename "$workdir/$pkgname", "$ {workdir}_1" + rename("$workdir/$pkgname", "$ {workdir}_1") || die "unable rename $workdir/$pkgname: $!\n"; rmdir $workdir; - rename "$ {workdir}_1", $workdir + rename("$ {workdir}_1", $workdir) || die "unable to rename $ {workdir}_1: $!\n"; $this->unpacked_tree($workdir); } @@ -257,7 +257,7 @@ sub prep { # grep {/^\./} readdir DIR; # closedir DIR; - system("cd $dir; find . -print | pkgproto > ./prototype") == 0 + (system("cd $dir; find . -print | pkgproto > ./prototype") == 0) || die "error during pkgproto: $!\n"; open(PKGPROTO, ">>$dir/prototype") @@ -280,7 +280,7 @@ sub prep { close PKGINFO; print PKGPROTO "i pkginfo=./pkginfo\n"; - mkdir "$dir/install", 0755; + mkdir("$dir/install", 0755) || die "unable to mkdir $dir/install: $!"; open(COPYRIGHT, ">$dir/install/copyright") || die "error creating copyright: $!\n"; print COPYRIGHT $this->copyright; @@ -311,12 +311,12 @@ sub build { my $this = shift; my $dir = $this->unpacked_tree; - system("cd $dir; pkgmk -r / -d .") == 0 + (system("cd $dir; pkgmk -r / -d .") == 0) || die "Error during pkgmk: $!\n"; my $pkgname = $this->converted_name; my $name = $this->name."-".$this->version.".pkg"; - system("pkgtrans $dir $name $pkgname") == 0 + (system("pkgtrans $dir $name $pkgname") == 0) || die "Error during pkgtrans: $!\n"; rename "$dir/$name", $name; return $name; diff --git a/Alien/Package/Rpm.pm b/Alien/Package/Rpm.pm index 2bbac98..376da16 100644 --- a/Alien/Package/Rpm.pm +++ b/Alien/Package/Rpm.pm @@ -51,7 +51,7 @@ sub install { my $this=shift; my $rpm=shift; - system("rpm -ivh ".(exists $ENV{RPMINSTALLOPT} ? $ENV{RPMINSTALLOPT} : '').$rpm) == 0 + (system("rpm -ivh ".(exists $ENV{RPMINSTALLOPT} ? $ENV{RPMINSTALLOPT} : '').$rpm) == 0) or die "Unable to install"; } @@ -145,7 +145,7 @@ sub unpack { $this->SUPER::unpack(@_); my $workdir=$this->unpacked_tree; - system("rpm2cpio ".$this->filename." | (cd $workdir; cpio --extract --make-directories --no-absolute-filenames --preserve-modification-time) 2>/dev/null") == 0 + (system("rpm2cpio ".$this->filename." | (cd $workdir; cpio --extract --make-directories --no-absolute-filenames --preserve-modification-time) 2>/dev/null") == 0) or die "Unpacking of `".$this->filename."' failed"; # If the package is relocatable. We'd like to move it to be under @@ -168,11 +168,11 @@ sub unpack { foreach (split m:/:, $this->prefixes) { if ($_ ne '') { # this keeps us from using anything but relative paths. $collect.="/$_"; - mkdir $collect,0755 || die "unable to mkdir $collect: $!"; + mkdir($collect,0755) || die "unable to mkdir $collect: $!"; } } # Now move all files in the package to the directory we made. - system("mv", @filelist, "$workdir/".$this->prefixes) == 0 + (system("mv", @filelist, "$workdir/".$this->prefixes) == 0) or die "error moving unpacked files into the default prefix directory: $!"; } diff --git a/Alien/Package/Slp.pm b/Alien/Package/Slp.pm index d2db7a3..32fe76b 100644 --- a/Alien/Package/Slp.pm +++ b/Alien/Package/Slp.pm @@ -114,7 +114,7 @@ sub install { my $this=shift; my $slp=shift; - system("slpi", $slp) == 0 + (system("slpi", $slp) == 0) or die "Unable to install"; } @@ -250,7 +250,7 @@ sub build { # something like that, becuase it results in a tar file where all # the files in it start with "./", which is consitent with how # normal stampede files look. - system("(cd ".$this->unpacked_tree."; tar cf - ./*) | bzip2 - > $slp") == 0 + (system("(cd ".$this->unpacked_tree."; tar cf - ./*) | bzip2 - > $slp") == 0) or die "package build failed: $!"; # Now append the footer. diff --git a/Alien/Package/Tgz.pm b/Alien/Package/Tgz.pm index f31bb8e..4cb4f67 100644 --- a/Alien/Package/Tgz.pm +++ b/Alien/Package/Tgz.pm @@ -66,7 +66,7 @@ sub install { my $tgz=shift; if (-x "/sbin/installpkg") { - system("/sbin/installpkg", "$tgz") == 0 + (system("/sbin/installpkg", "$tgz") == 0) or die "Unable to install"; } else { @@ -162,7 +162,7 @@ sub unpack { $this->SUPER::unpack(@_); my $file=$this->filename; - system("cat $file | (cd ".$this->unpacked_tree."; tar zxpf -)") == 0 + (system("cat $file | (cd ".$this->unpacked_tree."; tar zxpf -)") == 0) or die "Unpacking of `$file' failed: $!"; # Delete the install directory that has slackware info in it. system("cd ".$this->unpacked_tree."; rm -rf ./install"); @@ -187,7 +187,8 @@ sub prep { my $out=$this->unpacked_tree."/install/".${scripttrans()}{$script}; next if ! defined $data || $data =~ m/^\s*$/; if (!$install_made) { - mkdir $this->unpacked_tree."/install", 0755; + mkdir($this->unpacked_tree."/install", 0755) + || die "unable to mkdir ".$this->unpacked_tree."/install: $!"; $install_made=1; } open (OUT, ">$out") || die "$out: $!"; @@ -208,7 +209,7 @@ sub build { my $this=shift; my $tgz=$this->name."-".$this->version.".tgz"; - system("cd ".$this->unpacked_tree."; tar czf ../$tgz .") == 0 + (system("cd ".$this->unpacked_tree."; tar czf ../$tgz .") == 0) or die "Package build failed"; return $tgz; diff --git a/alien.pl b/alien.pl index 163ef4c..5505c5e 100755 --- a/alien.pl +++ b/alien.pl @@ -450,7 +450,7 @@ foreach my $file (@ARGV) { # Make .orig.tar.gz directory? if ($format eq 'deb' && ! $single && $generate) { # Make .orig.tar.gz directory. - system("cp", "-fa", "--", $package->unpacked_tree, $package->unpacked_tree.".orig") == 0 + (system("cp", "-fa", "--", $package->unpacked_tree, $package->unpacked_tree.".orig") == 0) or die "cp -fa failed"; } diff --git a/debian/changelog b/debian/changelog index 86d842f..5856042 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,18 @@ +alien (8.24) unstable; urgency=low + + * Corrected precidence problem that made alien not catch mkdir of the work + directory failing if the directory already existed (and let it delete the + existing directory). Closes: #181061 + * Fixed several other instances of the same precidence problem in the code. + + -- Joey Hess Sat, 15 Feb 2003 14:18:44 -0500 + +alien (8.23) unstable; urgency=low + + * Updated j2sdk patch again. + + -- Joey Hess Mon, 3 Feb 2003 22:51:11 -0500 + alien (8.22) unstable; urgency=low * Use rpmbuild -bb instead of rpm -bb, as it seems that rpm -bb has stopped diff --git a/patches/j2sdk_1.4.1_01-4.diff b/patches/j2sdk_1.4.1_01-4.diff new file mode 100644 index 0000000..7e57ab5 --- /dev/null +++ b/patches/j2sdk_1.4.1_01-4.diff @@ -0,0 +1,320 @@ +--- j2sdk-1.4.1_01.orig/debian/dirs ++++ j2sdk-1.4.1_01/debian/dirs +@@ -0,0 +1,4 @@ ++usr/share/doc ++usr/share/man ++usr/lib/netscape/plugins-libc6 ++usr/lib/mozilla/plugins +--- j2sdk-1.4.1_01.orig/debian/control ++++ j2sdk-1.4.1_01/debian/control +@@ -0,0 +1,31 @@ ++Source: j2sdk ++Section: alien ++Priority: extra ++Maintainer: Gerald Turner ++ ++Package: j2sdk1.4 ++Architecture: i386 ++Depends: java-common, ${shlibs:Depends} ++Provides: j2sdk1.4, j2re1.4, java-virtual-machine, java2-runtime, java-compiler, java2-compiler ++Suggests: netscape | mozilla (>= 0.9.3+0-1) ++Description: Java(TM) 2 Software Development Kit, Standard Edition ++ The Java 2 SDK, Standard Edition includes the Java ++ Virtual Machine, core class libraries and tools used ++ by programmers to develop Java software applets and ++ applications. The SDK also provides the foundation ++ for IDE (Integrated Development Environment) tools ++ such as Sun's Forte for Java, Community Edition, ++ the Java(TM) 2 Platform, Enterprise Edition (J2EE), ++ Java-based application servers and more. ++ The Java 2 Software Development Kit, SDK, is a ++ development environment for building applications, ++ applets, and components that can be deployed on ++ the Java platform. The Java 2 SDK software includes ++ tools useful for developing and testing programs ++ written in the Java programming language and running ++ on the Java platform. These tools are designed to ++ be used from the command line. Except for ++ appletviewer, these tools do not provide a ++ graphical user interface. ++ . ++ (Converted from a rpm package by alien.) +--- j2sdk-1.4.1_01.orig/debian/prerm ++++ j2sdk-1.4.1_01/debian/prerm +@@ -0,0 +1,34 @@ ++#!/bin/sh ++ ++case "`uname -m`" in ++ i[3-7]86 | ia32 | ia64) ++ ARCH=i386 ++ ;; ++ sparc*) ++ ARCH=sparc ++ ;; ++ *) ++ ARCH="`uname -m`" ++ ;; ++esac ++ ++if [ $1 = remove ] ++then ++ for i in appletviewer extcheck idlj jar jarsigner java javac javadoc \ ++ javah javap jdb keytool kinit klist ktab native2ascii orbd \ ++ policytool rmic rmid rmiregistry serialver servertool \ ++ tnameserv ControlPanel HtmlConverter ++ do ++ update-alternatives --remove $i /usr/lib/j2sdk1.4/bin/$i ++ done ++ ++ update-alternatives \ ++ --remove \ ++ javaplugin.so \ ++ /usr/lib/j2sdk1.4/jre/plugin/${ARCH}/ns4/javaplugin.so ++ ++ update-alternatives \ ++ --remove \ ++ javaplugin_oji.so \ ++ /usr/lib/j2sdk1.4/jre/plugin/${ARCH}/ns610/libjavaplugin_oji.so ++fi +--- j2sdk-1.4.1_01.orig/debian/rules ++++ j2sdk-1.4.1_01/debian/rules +@@ -0,0 +1,76 @@ ++#!/usr/bin/make -f ++# debian/rules for alien ++ ++# Uncomment this to turn on verbose mode. ++export DH_VERBOSE=1 ++ ++# Use v3 compatability mode, so ldconfig gets added to maint scripts. ++export DH_COMPAT=3 ++ ++PACKAGE=$(shell dh_listpackages) ++ ++build: ++ dh_testdir ++ ++clean: ++ dh_testdir ++ dh_testroot ++ dh_clean ++ ++binary-indep: build ++ ++binary-arch: build ++ dh_testdir ++ dh_testroot ++ dh_clean -k ++ dh_installdirs ++ ++# Copy the packages's files. ++ find . -maxdepth 1 -mindepth 1 -not -name debian -print0 | \ ++ xargs -0 -r -i cp -a {} debian/$(PACKAGE) ++ ++# ++# If you need to move files around in debian/$(PACKAGE) or do some ++# binary patching, do it here ++# ++ ++ mv debian/$(PACKAGE)/usr/java/j2sdk1.4.1_01 \ ++ debian/$(PACKAGE)/usr/lib/j2sdk1.4 ++ rmdir debian/$(PACKAGE)/usr/java ++ ++ mv debian/$(PACKAGE)/usr/lib/j2sdk1.4/man/* \ ++ debian/$(PACKAGE)/usr/share/man ++ rmdir debian/$(PACKAGE)/usr/lib/j2sdk1.4/man ++ ++ rm debian/$(PACKAGE)/usr/share/man/ja ++ mv debian/$(PACKAGE)/usr/share/man/ja_JP.eucJP \ ++ debian/$(PACKAGE)/usr/share/man/ja ++ ++ for i in `find debian/$(PACKAGE)/usr/share/man -type f` ; \ ++ do mv $$i `echo $$i | sed 's/\.\([^.]*\)$$/.j2sdk14.\1/'` ; \ ++ done ++ ++ if [ -f ../j2sdk-1_4_1-doc.zip ] ; then \ ++ unzip -q -d debian/$(PACKAGE)/usr/share/doc \ ++ ../j2sdk-1_4_1-doc.zip ; \ ++ mv debian/$(PACKAGE)/usr/share/doc/docs \ ++ debian/$(PACKAGE)/usr/share/doc/$(PACKAGE) ; \ ++ else \ ++ echo j2sdk-1_4_1-doc.zip not found, skipping documentation ; \ ++ fi ++ ++ dh_installdocs ++ dh_installchangelogs ++# This has been known to break on some wacky binaries. ++# dh_strip ++ dh_compress ++ dh_fixperms ++ dh_makeshlibs ++ dh_installdeb ++ -dh_shlibdeps ++ dh_gencontrol ++ dh_md5sums ++ dh_builddeb ++ ++binary: binary-indep binary-arch ++.PHONY: build clean binary-indep binary-arch binary +--- j2sdk-1.4.1_01.orig/debian/changelog ++++ j2sdk-1.4.1_01/debian/changelog +@@ -0,0 +1,44 @@ ++j2sdk (1.4.1_01-4) experimental; urgency=low ++ ++ * New upstream release ++ ++ -- Gerald Turner Tue, 14 Jan 2003 17:03:09 -0800 ++ ++j2sdk (1.4.1-3) experimental; urgency=low ++ ++ * New upstream release ++ * Detection and installation of j2sdk-1_4_1-doc.zip (must be downloaded ++ and copied to the same directory where alien is executed) ++ ++ -- Gerald Turner Wed, 2 Oct 2002 16:41:24 -0700 ++ ++j2sdk (1.4.1-2) experimental; urgency=low ++ ++ * Added java-common Depends ++ * Added java-virtual-machine, java2-runtime, java-compiler, and ++ java2-compiler Provides ++ * Added netscape and mozilla Suggests ++ ++ -- Gerald Turner Thu, 23 Aug 2002 09:07:09 -0700 ++ ++j2sdk (1.4.1-1) experimental; urgency=low ++ ++ * New upstream release ++ * Detection and installation of j2sdk-1_4_1-rc-doc.zip (must be downloaded ++ and copied to the same directory where alien is executed) ++ ++ -- Gerald Turner Thu, 22 Aug 2002 16:22:33 -0700 ++ ++j2sdk (1.4.0_01-1) experimental; urgency=low ++ ++ * New upstream release ++ * Detection and installation of j2sdk-1_4_0-doc.zip (must be downloaded ++ and copied to the same directory where alien is executed) ++ ++ -- Gerald Turner Thu, 22 Aug 2002 15:44:54 -0700 ++ ++j2sdk (1.4.0-1) experimental; urgency=low ++ ++ * Converted from .rpm format to .deb ++ ++ -- Gerald Turner Wed, 22 May 2002 12:46:34 -0700 +--- j2sdk-1.4.1_01.orig/debian/postinst ++++ j2sdk-1.4.1_01/debian/postinst +@@ -0,0 +1,75 @@ ++#!/bin/sh ++ ++case "`uname -m`" in ++ i[3-7]86 | ia32 | ia64) ++ ARCH=i386 ++ ;; ++ sparc*) ++ ARCH=sparc ++ ;; ++ *) ++ ARCH="`uname -m`" ++ ;; ++esac ++ ++if [ $1 = configure ] ++then ++ for i in appletviewer extcheck idlj jar jarsigner java javac javadoc \ ++ javah javap jdb keytool kinit klist ktab native2ascii orbd \ ++ policytool rmic rmid rmiregistry serialver servertool \ ++ tnameserv ControlPanel HtmlConverter ++ do ++ if [ -e /usr/share/man/man1/$i.j2sdk14.1.gz ] ++ then ++ if [ -e /usr/share/man/ja/man1/$i.j2sdk14.1.gz ] ++ then ++ update-alternatives \ ++ --install \ ++ /usr/bin/$i \ ++ $i \ ++ /usr/lib/j2sdk1.4/bin/$i \ ++ 1401 \ ++ --slave \ ++ /usr/share/man/man1/$i.1.gz \ ++ $i.1.gz \ ++ /usr/share/man/man1/$i.j2sdk14.1.gz \ ++ --slave \ ++ /usr/share/man/ja/man1/$i.1.gz \ ++ $i.ja.1.gz \ ++ /usr/share/man/ja/man1/$i.j2sdk14.1.gz ++ else ++ update-alternatives \ ++ --install \ ++ /usr/bin/$i \ ++ $i \ ++ /usr/lib/j2sdk1.4/bin/$i \ ++ 1401 \ ++ --slave \ ++ /usr/share/man/man1/$i.1.gz \ ++ $i.1.gz \ ++ /usr/share/man/man1/$i.j2sdk14.1.gz ++ fi ++ else ++ update-alternatives \ ++ --install \ ++ /usr/bin/$i \ ++ $i \ ++ /usr/lib/j2sdk1.4/bin/$i \ ++ 1401 ++ fi ++ done ++ ++ update-alternatives \ ++ --install \ ++ /usr/lib/netscape/plugins-libc6/javaplugin.so \ ++ javaplugin.so \ ++ /usr/lib/j2sdk1.4/jre/plugin/${ARCH}/ns4/javaplugin.so \ ++ 1401 ++ ++ update-alternatives \ ++ --install \ ++ /usr/lib/mozilla/plugins/javaplugin_oji.so \ ++ javaplugin_oji.so \ ++ /usr/lib/j2sdk1.4/jre/plugin/${ARCH}/ns610/libjavaplugin_oji.so \ ++ 1401 ++fi +--- j2sdk-1.4.1_01.orig/debian/copyright ++++ j2sdk-1.4.1_01/debian/copyright +@@ -0,0 +1,35 @@ ++This package was debianized by the alien program by converting ++a binary .rpm package on Tue, 14 Jan 2003 17:03:09 -0800 ++ ++Copyright: 1994-2001 Sun Microsystems, Inc. ++ ++Information from the binary package: ++Name : j2sdk Relocations: (not relocateable) ++Version : 1.4.1_01 Vendor: Sun Microsystems ++Release : fcs Build Date: Mon Sep 30 03:18:37 2002 ++Install date: (not installed) Build Host: localhost.localdomain ++Group : Development/Tools Source RPM: j2sdk-1.4.1_01-fcs.src.rpm ++Size : 83017072 License: 1994-2001 Sun Microsystems, Inc. ++Packager : Java Software ++URL : http://java.sun.com/linux ++Summary : Java(TM) 2 Software Development Kit, Standard Edition ++Description : ++The Java 2 SDK, Standard Edition includes the Java ++Virtual Machine, core class libraries and tools used ++by programmers to develop Java software applets and ++applications. The SDK also provides the foundation ++for IDE (Integrated Development Environment) tools ++such as Sun's Forte for Java, Community Edition, ++the Java(TM) 2 Platform, Enterprise Edition (J2EE), ++Java-based application servers and more. ++The Java 2 Software Development Kit, SDK, is a ++development environment for building applications, ++applets, and components that can be deployed on ++the Java platform. The Java 2 SDK software includes ++tools useful for developing and testing programs ++written in the Java programming language and running ++on the Java platform. These tools are designed to ++be used from the command line. Except for ++appletviewer, these tools do not provide a ++graphical user interface. ++