我在图像魔法中有一个看起来很奇怪的新问题.. 我正在使用mac osx雪豹,我已经在它上面安装了图像magick并且它在命令上正常工作.. 但是当我从grails类中调用它时,就像下面的片段一样,它给了我 “无法运行程序”转换“:错误= 2,没有这样的文件或目录”
代码是: -
public static boolean resizeImage(String srcPath, String destPath,String size) {
ArrayList<String> command = new ArrayList<String>(10);
command.add("convert");
command.add("-geometry");
command.add(size);
command.add("-quality");
command.add("100" );
command.add(srcPath);
command.add(destPath);
System.out.println(command);
return exec((String[])command.toArray(new String[1]));
}
private static boolean exec(String[] command) {
Process proc;
try {
//System.out.println("Trying to execute command " + Arrays.asList(command));
proc = Runtime.getRuntime().exec(command);
} catch (IOException e) {
System.out.println("IOException while trying to execute " );
for(int i =0 ; i<command.length; i++) {
System.out.println(command[i]);
}
return false;
}
//System.out.println("Got process object, waiting to return.");
int exitStatus;
while (true) {
try {
exitStatus = proc.waitFor();
break;
} catch (java.lang.InterruptedException e) {
System.out.println("Interrupted: Ignoring and waiting");
}
}
if (exitStatus != 0) {
System.out.println("Error executing command: " + exitStatus);
}
return (exitStatus == 0);
}
我尝试过像ls这样的正常命令,这样就可以了,所以问题是grails无法找到转换命令本身..这是一个os问题还是什么?
答案 0 :(得分:1)
(见答案的下方)
我遇到了同样的问题。问题似乎与Mac OS X有关,因为我们有几个Linux实例正常运行。该错误类似于以下内容:
java.io.IOException:无法运行程序“/usr/bin/ImageMagick-6.7.3/bin/convert /a/temp/in/tmpPic3143119797006817740.png /a/temp/out/100000726.png”:错误= 2,没有这样的文件或目录
所有文件都存在,并且在chmod 777目录中 - 正如您所指出的,从shell运行确切命令可以正常工作。
我的理论是,imagemgick无法加载某种类型的库本身,“没有这样的文件”是指dylib或类似的东西。
我尝试过设置LD_LIBRARY_PATH和其他一些无效。
我终于有了这个工作。这是我如何设置它。我希望这会有所帮助。
对我来说,修复的关键是我将'convert'包装成shell脚本,设置了一堆环境变量,然后调用该shell脚本而不是直接转换:
(convertWrapper.sh)
export MAGICK_HOME=/usr/local/ImageMagick-6.7.5
export MAGICK_CONFIGURE_PATH=${MAGICK_HOME}/etc/ImageMagick:${MAGICK_HOME}/share/doc/ImageMagick/www/source
export PATH=${PATH}:${MAGICK_HOME}/bin
export LD_LIBRARY_PATH=${MAGICK_HOME}/lib:${LD_LIBRARY_PATH}
export DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH}:${MAGICK_HOME}/lib
export MAGICK_TMPDIR=/private/tmp
echo "$@" >> /private/tmp/m.log 2>&1
/usr/local/ImageMagick-6.7.5/bin/convert -verbose "$@" >> /private/tmp/m.log 2>&1
(convertWrapper.sh)
此外,转换调用正在做一些相当复杂的事情,所以我添加了参数'-respect-parenthesis'(可能会或可能不会产生影响)。
我不确定需要多少环境变量设置,因为我在黑暗中刺了一会儿,但因为这只适用于我的开发盒......
答案 1 :(得分:0)
从Java运行命令时,需要确定PATH的设置。它必须与从终端运行时的那个不同。
您是否正在以不同的用户身份运行Grails(通过Tomcat?)?它可能与普通用户的路径不同。
答案 2 :(得分:0)
你可能想尝试一个属于grails生态系统的图像插件
http://www.grails.org/ImageTools+plugin
应用程序在服务器中运行时的grails路径可能与从命令行运行java
不同答案 3 :(得分:0)
我这样做:
将“convert”文件放入/ usr / bin
然后添加到Config.groovy:
gk {
imageMagickPath = "/usr/bin/convert"
}
然后在我的ImageService.groovy中:
import org.springframework.web.context.request.RequestContextHolder as RCH
[..]
def grailsApplication = RCH.requestAttributes.servletContext.grailsApplication
def imPath = grailsApplication.config.gk.imageMagickPath
def command = imPath + " some_properties"
def proc = Runtime.getRuntime().exec(command)
所以这样你得到的命令如下:/ usr / bin / convert some_properties
它有效,但不要忘记将文件“转换”到您的位置并将其用于此位置。