Im getting a strange error when im compiling my code on a server and downloading it and trying to run it on my computer.
Im basically compiling some java files on an EC2 instance, then loading them into a storage for later use.
When i download the files onto my computer and try to run them i am getting the following errors:
Exception in thread "main" java.lang.ClassFormatError: Incompatible magic value
4022320623 in class file HelloWorldPackage/HelloWorldClass
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:787)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:447)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:476)
I am compiling the files using the following method:
public void compileProject()
{
String command = "javac ";
for(String s: this.getPackages())
{
File[] files = new File("/home/benuni/CompileFiles/" + project + "/src/" + s).listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".java");
}
});
for(File f: files)
{
command = command + f.getAbsolutePath() + " ";
}
}
try {
System.out.println("command: '"+ command +"'");
Process pro = Runtime.getRuntime().exec(command);
printLines(" stderr:", pro.getErrorStream());
pro.waitFor();
this.moveClassFiles();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
and am uploading the files with this method:
public void uploadBin()
{
for(String s: this.getPackages())
{
File[] filesInPackage = new File("/home/benuni/CompileFiles/"+this.project+"/bin/"+s).listFiles();
for(File f: filesInPackage)
{
String key = this.project+"/"+this.version+"/bin/"+s+"/"+f.getName();
s3.putObject("devcloud",key,f);
}
}
}
does anyone know what i am doing wrong? The class files are runnable when i compile them on the computer, but when i upload them to the cloud and download them im getting the error?
Thanks,
Ben
Java is telling you it's not a valid class file because it doesn't begin with the expected byte sequence (
0xCAFEBABE
). Something went wrong when you downloaded it. Try inspecting your class file in an editor and see if maybe you actually have some other content in there.If you use Maven te build your project. try to disable resource filtering in maven-war-plugin like that
<filtering>false</filtering>
in POM file:Okay i figured it out with thanks to @Asaph mentioning the downloading going wrong..
Basically the downloading was fine, it was the way i was writing the file.
When im downloading projects, im downloading the source and binaries, but i was writing both files as if they were the same.
So changed the code to check the file type and then use the appropriate writer when necessary. If by some miracle someone has the same issue or is doing something similar here is the code:
(Note this was just written 5 second ago to fix the problem and is very poorly written, im about to refactor it myself, but i cant do everything for you)