Ghostscript在命令行中工作,但如果在AIX上从Java执行,则不工作 简短描述
我必须在AIX上运行Ghostscript。它在命令行中工作: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
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();
}
工作。酷