Ява - можно ли выбрать номер версии при компиляции файла? - PullRequest
1 голос
/ 09 июля 2010

Я написал код Java и скомпилировал его. (Foo1.6.class) Согласно моему поиску, на моем локальном компьютере установлена ​​Java 1.6, а на сервер tomcat, который я загрузил, foo1.6.class принимает только версию 1.5.

Я полагаю, что это причина того, что ошибочный номер версии выдается как показано ниже.

У меня вопрос, есть ли какой-нибудь способ, которым я могу скомпилировать свой файл Java, используя номер версии 1.5? Посмотрел на javac cmd, но похоже, что это не часть варианта. Но я не думаю, что удалить 1.6 и установить Java 1.5 по этой причине не очень хороший вариант. Как люди справляются с такой ситуацией?

Заранее спасибо!

exception

javax.servlet.ServletException: Bad version number in .class file (unable to load class resume_builder.ResumeBuilder)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:273)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

root cause

java.lang.UnsupportedClassVersionError: Bad version number in .class file (unable to load class resume_builder.ResumeBuilder)
    org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1884)
    org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:889)
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1353)
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1232)
    org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:128)
    org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:66)
    java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
    java.lang.Class.getDeclaredConstructors0(Native Method)
    java.lang.Class.privateGetDeclaredConstructors(Class.java:2357)
    java.lang.Class.getConstructor0(Class.java:2671)
    java.lang.Class.newInstance0(Class.java:321)
    java.lang.Class.newInstance(Class.java:303)
    org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:142)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:311)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:315)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

Ответы [ 3 ]

10 голосов
/ 09 июля 2010

Вы можете использовать javac -target 1.5 -source 1.5.

Компилятор Java позволяет вам использовать номер версии ниже, чем его текущая целевая версия, только если вы также используете версию совместимости с исходным кодом, которая не выше целевой (есть исключения для исходных версий ниже 1.4).

4 голосов
/ 09 июля 2010
javac -help
Usage: javac <options> <source files>
where possible options include:
  -g                         Generate all debugging info
  -g:none                    Generate no debugging info
  -g:{lines,vars,source}     Generate only some debugging info
  -nowarn                    Generate no warnings
  -verbose                   Output messages about what the compiler is doing
  -deprecation               Output source locations where deprecated APIs are used
  -classpath <path>          Specify where to find user class files and annotation processors
  -cp <path>                 Specify where to find user class files and annotation processors
  -sourcepath <path>         Specify where to find input source files
  -bootclasspath <path>      Override location of bootstrap class files
  -extdirs <dirs>            Override location of installed extensions
  -endorseddirs <dirs>       Override location of endorsed standards path
  -proc:{none,only}          Control whether annotation processing and/or compilation is done.
  -processor <class1>[,<class2>,<class3>...]Names of the annotation processors to run; bypasses default discovery process
  -processorpath <path>      Specify where to find annotation processors
  -d <directory>             Specify where to place generated class files
  -s <directory>             Specify where to place generated source files
  -implicit:{none,class}     Specify whether or not to generate class files for implicitly referenced files 
  -encoding <encoding>       Specify character encoding used by source files
  -source <release>          Provide source compatibility with specified release
  -target <release>          Generate class files for specific VM version
  -version                   Version information
  -help                      Print a synopsis of standard options
  -Akey[=value]              Options to pass to annotation processors
  -X                         Print a synopsis of nonstandard options
  -J<flag>                   Pass <flag> directly to the runtime system

Обратите внимание на аргументы -source и -target?

2 голосов
/ 09 июля 2010

Правильный ответ в вашей ситуации - флаги -source и -target, как указано в x4u.

Вы спрашиваете о необходимости удаления Java 6, чтобы иметь возможность установить Java 5. Это редко требуется.Компилятор "javac" поставляется с JDK, и многие из них можно установить.Вы можете рассмотреть возможность установки Java 5 JDK без удаления Java 6, а затем просто скомпилировать с этой установкой javac.Это гарантирует, что ваш код будет работать в среде исполнения Java 5 (и это то, что я лично делаю).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...