我遇到一个奇怪的问题,我可以在直接运行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();
}
}
}
任何方向或有人面临类似的问题?
答案 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在与脚本不同的用户上下文中运行。