我正在尝试创建一个可运行的jar文件。我的项目包括models.txt文件。我的项目在eclipse中完美运行,没有错误,但是当导出到可运行的jar文件时,它不起作用。我特此附上错误和调用文件的代码段。
public static HashMap<String, RenderModel> getModelList(String file) throws IOException {
List<String> data;
HashMap<String, RenderModel> namesToModels = new HashMap<String, RenderModel>();
if (file != null) {
data = Files.readAllLines(Paths.get(file), StandardCharsets.UTF_8);
} else {
String path = "models/models.txt";
data = Files.readAllLines(Paths.get(path), StandardCharsets.UTF_8);
}
Iterator<String> dataIterator = data.iterator();
while (dataIterator.hasNext()) {
String dataLine = dataIterator.next();
System.out.println(dataLine);
String[] line = dataLine.split("; ");
String key = line[0];
String valueObj = line[1];
String valueMtl = line[2];
float scale = Float.parseFloat((String) line[3]);
RenderModel v = new RenderModel(valueObj, valueMtl, scale);
namesToModels.put(key, v);
}
RenderModel v = new RenderModel("custom", "custom", 1.0f);
namesToModels.put("Choose Model from file", v);
return namesToModels;
}
错误图片:
答案 0 :(得分:1)
如果文件位于Jar
但您无法阅读,请尝试访问这些文件:
getClass().getClassLoader().getResource(fileName);
使用此代替静态方法:
ClassName.class.getClassLoader().getResource(fileName);
其中fileName
是文件的名称,ClassName
是从中调用语句的类的名称。
答案 1 :(得分:0)
在您的代码中,model.txt的路径是&#39; src / models / model.txt&#39;。打包项目时,通常不包含src文件夹。然后你必须改变文件位置;可以更好地将文件放在jar之外,但是在java类路径中。
答案 2 :(得分:0)
它不起作用,因为当你在其他地方运行你的jar时路径#include <vector>
#include <fstream>
struct MyStruct{
int x;
float y;
float array[100];
MyStruct(){
x = 0;
y = 1.0;
for(int i=0; i<100; i++){
array[i] = i;
}
}
void print(){
std::cout << x << " " << y << std::endl;
for(int i=0; i<100; i++){
std::cout << i << " ";
}
}
};
template<typename T>
void write_pod(std::ofstream& out, T& t)
{
out.write(reinterpret_cast<char*>(&t), sizeof(T));
}
template<typename T>
void read_pod(std::ifstream& in, T& t)
{
in.read(reinterpret_cast<char*>(&t), sizeof(T));
}
template<typename T>
void write_pod_vector(std::ofstream& out, std::vector<T>& vect)
{
long size = vect.size();
write_pod<long>(out, size);
out.write(reinterpret_cast<char*>(&vect.front()), size * sizeof(T));
}
template<typename T>
void read_pod_vector(std::ifstream& in, std::vector<T>& vect)
{
long size;
read_pod(in, size);
vect.resize(size);
in.read(reinterpret_cast<char*>(&vect.front()), size * sizeof(T));
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "weighing_area");
std::vector<MyStruct> testArray;
testArray.push_back(MyStruct());
testArray.push_back(MyStruct());
ofstream myfile("/home/me/TEST.dat");
write_pod_vector<MyStruct>(myfile, testArray);
myfile.close();
std::vector<MyStruct> readArray;
ifstream readfile("/home/me/TEST.dat");
read_pod_vector(readfile, readArray);
cout << readArray.size() << endl;
for(int i=0; i<readArray.size(); i++){
MyStruct& myStruct = readArray[i];
myStruct.print();
}
return 0;
}
上没有任何文件,这条路径只存在于你的IDE中(当然你可以将你的jar放在一个位置它可以到达那条路径,但这不是它应该如何),当你将项目打包到一个jar文件中时,它被打包在包src/models/models.txt
中,如果你想把它作为默认文件你可以通过classpath阅读。