Ghostscript在命令行中工作,但如果在AIX上从Java执行,则不工作 简短描述

Ghostscript在命令行中工作,但如果在AIX上从Java执行,则不工作 简短描述,java,pdf,exec,aix,ghostscript,Java,Pdf,Exec,Aix,Ghostscript,我必须在AIX上运行Ghostscript。它在命令行中工作: XXXXXXXX:i2zate:/home/i2zate>/usr/bin/gs -dFIXEDMEDIA -dPDFFitPage -dFirstPage=1 -dLastPage=1 -dBATCH -dNOPAUSE -dNOPROMPT -dSAFER -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=0 -dDEVICEWIDTH=90 -dDEVICEHEIGH

我必须在AIX上运行Ghostscript。它在命令行中工作:

XXXXXXXX:i2zate:/home/i2zate>/usr/bin/gs -dFIXEDMEDIA -dPDFFitPage -dFirstPage=1 -dLastPage=1 -dBATCH -dNOPAUSE -dNOPROMPT -dSAFER -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=0 -dDEVICEWIDTH=90 -dDEVICEHEIGHT=120 -dORIENT1=true -sDEVICE=jpeg  -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sOutputFile=1.jpg porsche.pdf               
GPL Ghostscript 8.70 (2009-07-31)
Copyright (C) 2009 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Processing pages 1 through 1.
Page 1
ERROR: exec(): 0509-036 Cannot load program /usr/bin/gs because of the following errors:
ERROR:  0509-022 Cannot load module /usr/lib/libcairo.a(libcairo.so.2).
ERROR:  0509-150   Dependent module /usr/lib/libXrender.a(libXrender.so.1) could not be loaded.
ERROR:  0509-152   Member libXrender.so.1 is not found in archive
ERROR:  0509-022 Cannot load module gs.
ERROR:  0509-150   Dependent module /usr/lib/libcairo.a(libcairo.so.2) could not be loaded.
ERROR:  0509-022 Cannot load module .
如果我从Java运行相同的,它会显示一个错误

XXXXXXXX:i2zate:/home/i2zate>/usr/bin/gs -dFIXEDMEDIA -dPDFFitPage -dFirstPage=1 -dLastPage=1 -dBATCH -dNOPAUSE -dNOPROMPT -dSAFER -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=0 -dDEVICEWIDTH=90 -dDEVICEHEIGHT=120 -dORIENT1=true -sDEVICE=jpeg  -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sOutputFile=1.jpg porsche.pdf               
GPL Ghostscript 8.70 (2009-07-31)
Copyright (C) 2009 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Processing pages 1 through 1.
Page 1
ERROR: exec(): 0509-036 Cannot load program /usr/bin/gs because of the following errors:
ERROR:  0509-022 Cannot load module /usr/lib/libcairo.a(libcairo.so.2).
ERROR:  0509-150   Dependent module /usr/lib/libXrender.a(libXrender.so.1) could not be loaded.
ERROR:  0509-152   Member libXrender.so.1 is not found in archive
ERROR:  0509-022 Cannot load module gs.
ERROR:  0509-150   Dependent module /usr/lib/libcairo.a(libcairo.so.2) could not be loaded.
ERROR:  0509-022 Cannot load module .
我不明白,为什么会这样。你知道吗?你可以在下面找到一些环境信息。如果你还需要什么,请告诉我

更深层次的信息 java代码我使用:

package biz;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class DummyCaller {
    public static void main(String[] args) throws IOException, InterruptedException {
        printSystemProperties();
        System.out.println();
        printEnvironment();
        Process process = Runtime.getRuntime().exec( args );
        new StreamReader("OUT  ", process.getInputStream() ).start();
        new StreamReader("ERROR", process.getErrorStream() ).start();
        process.waitFor();
    }

    private static void printSystemProperties() {
        System.out.println( "System.getProperties(): " );
        List<String> keys = new ArrayList<String>();
        for (Object key : System.getProperties().keySet()) {
            keys.add( (String) key );
        }
        Collections.sort(keys);
        for (Object key : keys ) {
            System.out.println( "" + key + "=" + System.getProperty((String) key) );
        }
    }

    private static void printEnvironment() {
        System.out.println( "System.getEnv(): " );
        List<String> keys = new ArrayList<String>();
        keys.addAll(System.getenv().keySet());
        Collections.sort(keys);
        for (Object key : keys ) {
            System.out.println( "" + key + "=" + System.getenv().get( key) );
        }
    }

    public static class StreamReader extends Thread {
        private BufferedReader br;
        private String streamName;

        public StreamReader(String streamName, InputStream is ) {
            super();
            this.streamName = streamName;
            br = new BufferedReader( new InputStreamReader(is));
        }

        @Override
        public void run() {
            String line = null;
            try {
                while ( (line = br.readLine() ) != null ) {
                    System.out.println( streamName + ": " + line );
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
环境信息
来自
相同的命令行会话:

XXXXXXXX:i2zate:/home/i2zate>set
AUTHSTATE=compat
AWK=/usr/bin/awk
A__z='! LOGNAME'
BAR_BSALIB_PATH=/usr/tivoli/tsm/client/api/bin/xbsa.o
BASH=/usr/bin/bash
BASH_ARGC=()
BASH_ARGV=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="3" [1]="00" [2]="16" [3]="1" [4]="release" [5]="powerpc-ibm-aix5.1")
BASH_VERSION='3.00.16(1)-release'
COLUMNS=168
CSP_HOME=/opt/csp/at/test
DIRSTACK=()
DSMI_CONFIG=/usr/tivoli/tsm/client/api/bin/dsm.opt
DSMI_DIR=/usr/tivoli/tsm/client/api/bin
DSMI_INF_DIR=/usr/tivoli/tsm/client/informix/bin
DSMI_LOG=/var/opt/RRZ/log
DSMI_ORC_CONFIG=/usr/tivoli/tsm/client/oracle/bin/dsm.opt
DSMO_DEBUG=/var/opt/RRZ/log/orcagent.log
DSMO_NODE=XXXXXXXX_ORA
DSM_CONFIG=/usr/tivoli/tsm/client/ba/bin/dsm.opt
DSM_DIR=/usr/tivoli/tsm/client/ba/bin
DSM_LOG=/var/opt/RRZ/log
EDITOR=vi
EUID=623
GROUPS=()
HISTFILE=/home/i2zate/.bash_history
HISTFILESIZE=500
HISTSIZE=500
HOME=/home/i2zate
HOST=XXXXXXXX
HOSTNAME=XXXXXXXX
HOSTTYPE=powerpc
IFS=$' \t\n'
JAVA_HOME=/usr/java6_64/jre
JOBS=/opt/RRZ/AIX
LANG=en_US
LC_CTYPE=C
LC__FASTMSG=true
LINES=46
LOCPATH=/usr/lib/nls/loc
LOGIN=i2zate
LOGNAME=i2zate
LOGS=/var/opt/RRZ/log
MACHTYPE=powerpc-ibm-aix5.1
MAIL=/usr/spool/mail/i2zate
MAILCHECK=60
MAILMSG='[YOU HAVE NEW MAIL]'
NLSPATH=/usr/lib/nls/msg/%L/%N:/usr/lib/nls/msg/%L/%N.cat
NUI_NOCHECKSUM=1
NUI_NOTESDIR=/opt/lotus
ODMDIR=/etc/objrepos
OPTERR=1
OPTIND=1
OSTYPE=aix5.1
PATH=/usr/java6_64/jre/bin:/usr/java6_64/jre/bin:/usr/bin:/etc:/usr/sbin:/usr/ucb:/home/i2zate/bin:/usr/bin/X11:/sbin:.
PIPESTATUS=([0]="0")
PPID=2556030
PRINTER=prrz056
PROTS=/var/opt/RRZ/prots
PS1='$HOST:$USER:$PWD>'
PS2='> '
PS4='+ '
PWD=/home/i2zate
SHELL=/usr/bin/ksh
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=1
SPOC=/opt/RRZ/AIX/spoc
SPOCVER=6.1
SSH_CLIENT='XXXXXXXXXXXXXXXXXXXX'
SSH_CONNECTION='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
SSH_TTY=/dev/pts/0
SYS=AIX
TAPE=/dev/rmt0
TERM=xterm
TSM=/usr/tivoli/tsm/client/ba/bin/
TZ=MET-1METDST,M3.5.0/2:00,M10.5.0/3:00
UID=623
USER=i2zate
_=porsche.pdf

结果证明,LIBPATH是不正确的,Java向forked进程实例传递的是什么

1.步骤:获取Ghostscript的LIBPATH: 经过大量的谷歌搜索,我发现:

XXXXXXXX:i2zate:/home/i2zate>dump -Hv /usr/bin/gs

/usr/bin/gs:

                        ***Loader Section***
                      Loader Header Information
VERSION#         #SYMtableENT     #RELOCent        LENidSTR
0x00000001       0x00000137       0x00008118       0x000001ad

#IMPfilID        OFFidSTR         LENstrTBL        OFFstrTBL
0x0000000e       0x00062a68       0x00000e99       0x00062c15


                        ***Import File Strings***
INDEX  PATH                          BASE                MEMBER
0      /opt/freeware/lib:/opt/freeware/lib/gcc/powerpc-ibm-aix5.1.0.0/4.2.3:/opt/freeware/lib/gcc/powerpc-ibm-aix5.1.0.0/4.2.3/../../..:/usr/lib:/lib                   
1                                    libc.a              shr.o
2                                    libpthread.a        shr_comm.o
3                                    libpthread.a        shr_xpg5.o
4                                    libXt.a             shr4.o
5                                    libX11.a            shr4.o
6                                    libcairo.a          libcairo.so.2
7                                    libjpeg.a           libjpeg.so.62
8                                    libz.a              libz.so.1
9                                    libfontconfig.a     libfontconfig.so.1
10                                   libpng.a            libpng.so.3
11                                   libpaper.a          libpaper.so.1
12                                   libiconv.a          shr4.o
13                                   libdl.a             shr.o
这里你可以看到索引0(不要问我,它是什么意思,只是一个猜测,我需要它):/opt/freeware/lib:/opt/freeware/lib/gcc/powerpc-ibm-aix5.1.0.0/4.2.3:/opt/freeware/lib/gcc/powerpc-ibm-aix5.1.0.0/4.2.3/../..:/usr/lib

2.步骤:在java中传递LIBPATH 我稍微换了一个班。DummyCaller使用它获得的第一个参数作为分叉进程的LIBPATH。请参见更改的方法:

public static void main(String[] args) throws IOException, InterruptedException {
    printSystemProperties();
    System.out.println();
    printEnvironment();
    String[] command = new String[ args.length - 1 ];
    System.arraycopy(args, 1, command, 0, args.length-1);
    ProcessBuilder processBuilder = new ProcessBuilder( Arrays.asList(command));
    Map<String, String> env = processBuilder.environment();
    env.put("LIBPATH", args[0] );
    Process process = processBuilder.start();
    new StreamReader("OUT  ", process.getInputStream() ).start();
    new StreamReader("ERROR", process.getErrorStream() ).start();
    process.waitFor();
}

工作。很酷。

事实证明,LIBPATH是不正确的,Java向forked进程实例传递了什么

1.步骤:获取Ghostscript的LIBPATH: 经过大量的谷歌搜索,我发现:

XXXXXXXX:i2zate:/home/i2zate>dump -Hv /usr/bin/gs

/usr/bin/gs:

                        ***Loader Section***
                      Loader Header Information
VERSION#         #SYMtableENT     #RELOCent        LENidSTR
0x00000001       0x00000137       0x00008118       0x000001ad

#IMPfilID        OFFidSTR         LENstrTBL        OFFstrTBL
0x0000000e       0x00062a68       0x00000e99       0x00062c15


                        ***Import File Strings***
INDEX  PATH                          BASE                MEMBER
0      /opt/freeware/lib:/opt/freeware/lib/gcc/powerpc-ibm-aix5.1.0.0/4.2.3:/opt/freeware/lib/gcc/powerpc-ibm-aix5.1.0.0/4.2.3/../../..:/usr/lib:/lib                   
1                                    libc.a              shr.o
2                                    libpthread.a        shr_comm.o
3                                    libpthread.a        shr_xpg5.o
4                                    libXt.a             shr4.o
5                                    libX11.a            shr4.o
6                                    libcairo.a          libcairo.so.2
7                                    libjpeg.a           libjpeg.so.62
8                                    libz.a              libz.so.1
9                                    libfontconfig.a     libfontconfig.so.1
10                                   libpng.a            libpng.so.3
11                                   libpaper.a          libpaper.so.1
12                                   libiconv.a          shr4.o
13                                   libdl.a             shr.o
这里你可以看到索引0(不要问我,它是什么意思,只是一个猜测,我需要它):/opt/freeware/lib:/opt/freeware/lib/gcc/powerpc-ibm-aix5.1.0.0/4.2.3:/opt/freeware/lib/gcc/powerpc-ibm-aix5.1.0.0/4.2.3/../..:/usr/lib

2.步骤:在java中传递LIBPATH 我稍微换了一个班。DummyCaller使用它获得的第一个参数作为分叉进程的LIBPATH。请参见更改的方法:

public static void main(String[] args) throws IOException, InterruptedException {
    printSystemProperties();
    System.out.println();
    printEnvironment();
    String[] command = new String[ args.length - 1 ];
    System.arraycopy(args, 1, command, 0, args.length-1);
    ProcessBuilder processBuilder = new ProcessBuilder( Arrays.asList(command));
    Map<String, String> env = processBuilder.environment();
    env.put("LIBPATH", args[0] );
    Process process = processBuilder.start();
    new StreamReader("OUT  ", process.getInputStream() ).start();
    new StreamReader("ERROR", process.getErrorStream() ).start();
    process.waitFor();
}
工作。酷