通过UNIX脚本运行时,Jar完美运行,但在通过Crons运行时提供Null指针

时间:2016-05-09 09:41:05

标签: java unix cron

我遇到一个奇怪的问题,我可以在直接运行UNIX脚本时完全运行我的jar,但是当通过crons触发相同的UNIX脚本时,它会给我错误。

我的UNIX scirpt是这样的:myUnix.ksh

/path/to/java -jar /some/path/to/myJar.jar runTimeArgumentPathToMypropertyFile

以上代码如果通过UNIX命令运行:bash /path/to/my/script/myUnix.ksh运行完全正常。

但是当我通过crons触发脚本时:9 10 * * * bash /path/to/my/script/myUnix.ksh 它给了我空指针异常。

我的代码使用属性文件来加载某些可配置的项目,我作为运行时参数传递的路径。

给我空指针异常的行是我的代码访问属性文件值的地方。 它没有给我找到File Not exception。所以我的代码似乎找到了该文件并加载了它。

调试后,我发现我的属性对象在通过crons运行时没有键值对。我已经检查了此过程中涉及的所有文件的权限为0777.仍然没有解决方案。

这是我用来加载属性文件的代码:

/**
 * Used to initialise PM repository
 * @param keyNotCaseSensitive
 * @param absolutePathToMasterFile
 * @param filter
 * @throws GLDUtilException
 */
public static void initialize(boolean keyNotCaseSensitive, String absolutePathToMasterFile, String filter) throws GLDUtilException{
    if(!initialized){
        Map<String, String> mapOfFiles = GenParser.generateMapUsingPropertyFile(keyNotCaseSensitive, absolutePathToMasterFile);
        map= new LinkedHashMap<String, PropertyMap>();
        listOfPropertyMapNames= new ArrayList<String>();

        if(filter!=null){
            if(keyNotCaseSensitive){
                filter= filter.toUpperCase();
            }
            String[] fl = filter.split(UtilConstants.COMMA);
            Set<String> set = new HashSet<String>(Arrays.asList(fl));
            for(String key : mapOfFiles.keySet()){
                for(String flt: set){
                    if(keyNotCaseSensitive){
                        key=key.toUpperCase();
                    }
                    if(key.contains(flt.trim())){
                        PropertyMap pm = new PropertyMap(keyNotCaseSensitive, key, mapOfFiles.get(key));
                        map.put(key, pm);
                        listOfPropertyMapNames.add(key);
                    }
                }
            }
        }else{
            for(String key : mapOfFiles.keySet()){
                PropertyMap pm = new PropertyMap(keyNotCaseSensitive, key, mapOfFiles.get(key));
                map.put(key, pm);
                listOfPropertyMapNames.add(key);
            }
        }
        PMRepo.keyNotCaseSensitive=keyNotCaseSensitive;
        PMRepo.initialized=true;
    }
}

通用解析器:

    /**
 * 
 * @param keyNotCaseSensitive
 * @param absolutePathToFile
 * @return
 * @throws GLDUtilException
 *             UtilConstants.ERR0001,ERR0002
 */
public static Map<String, String> generateMapUsingPropertyFile(boolean keyNotCaseSensitive,String absolutePathToFile) throws GLDUtilException {
    Scanner fileScanner=null;
    try {
        fileScanner = new Scanner(new File(absolutePathToFile));
        Map<String, String> result = new LinkedHashMap<String, String>();
        while(fileScanner.hasNextLine()){
            String line = fileScanner.nextLine();
            if(line.contains(UtilConstants.EQ)){
                String[] pair =line.split(UtilConstants.EQ);
                                    System.out.println(line);
                if(keyNotCaseSensitive){
                    result.put(pair[0].trim().toUpperCase(), pair[1].trim());
                }else{
                    result.put(pair[0].trim(), pair[1].trim());
                }

            }
        }
        return result;
    } catch (FileNotFoundException e) {
        throw new GLDUtilException(MessageFormat.format(UtilConstants.ERR0001, absolutePathToFile), e);
    }finally{
        if(fileScanner!=null){
            fileScanner.close();
        }
    }

}

任何方向或有人面临类似的问题?

2 个答案:

答案 0 :(得分:0)

我明白了。 问题在于扫描器,在通用解析器中。 我只是更换了扫描仪

public static Map<String, String> generateMapUsingPropertyFile(boolean keyNotCaseSensitive,String absolutePathToFile) throws GLDUtilException {
    Scanner fileScanner=null;
    try {
        fileScanner = new Scanner(new File(absolutePathToFile));
        Map<String, String> result = new LinkedHashMap<String, String>();
        while(fileScanner.hasNextLine()){

使用像这样的BufferedReader:

public static Map<String, String> generateMapUsingPropertyFile(boolean keyNotCaseSensitive,String absolutePathToFile) throws GLDUtilException {
    BufferedReader br =null
    try {
        br= new BufferedReader (new FileReader(absolutePathToFile));
        Map<String, String> result = new LinkedHashMap<String, String>();
        String line =null;
        while((line=br.readLine())){

它奏效了,我不知道为什么,但它有效。

答案 1 :(得分:-1)

您需要清楚运行代码的用户上下文。我认为您的cron在与脚本不同的用户上下文中运行。