【问题标题】:how to compile java files in linux with a package如何使用包在linux中编译java文件
【发布时间】:2013-03-12 00:33:08
【问题描述】:

我能够在 Eclipse 中编译我的 Main.java 文件而没有任何问题。

在 Main.java 我有

package com.selenium.zLoadProfilerPkg;

在其他 3 个文件中我也有

package com.selenium.zLoadProfilerPkg;

但是,当我将整个结构上传到 linux 并尝试编译它时,出现错误:

[sgalkov@zpub zLoadProfilerPkg]$ pwd
/home/sgalkov/zpp_tech_git_checkout/profiler/zLoadProfiler/zLoadProfiler/src/com/selenium/zLoadProfilerPkg
[sgalkov@zpub zLoadProfilerPkg]$ cd /home/sgalkov/zpp_tech_git_checkout/profiler/zLoadProfiler/zLoadProfiler/src/com/selenium/zLoadProfilerPkg/; javac -cp ".:/home/sgalkov/zpp_tech_git_checkout/profiler/selenium-2.30.0/selenium-java-2.30.0.jar:/home/sgalkov/zpp_tech_git_checkout/profiler/selenium-2.30.0/libs/*:/home/sgalkov/zpp_tech_git_checkout/profiler/selenium-2.30.0/selenium-server-standalone-2.30.0.jar:/home/sgalkov/zpp_tech_git_checkout/profiler/browsermob-proxy-2.0-beta-7/browsermob-proxy-2.0-beta-7-sources.jar:/home/sgalkov/zpp_tech_git_checkout/profiler/browsermob-proxy-2.0-beta-7/lib/*:/home/sgalkov/zpp_tech_git_checkout/profiler/zLoadProfiler/zLoadProfiler/src/com/selenium/zLoadProfilerPkg" Main.java
Main.java:54: error: cannot find symbol
    BrowsermobProxy bmp = new BrowsermobProxy(PROXY_API_HOST, PROXY_API_PORT);
    ^
symbol:   class BrowsermobProxy
location: class Main

Main.java:54: error: cannot find symbol
    BrowsermobProxy bmp = new BrowsermobProxy(PROXY_API_HOST, PROXY_API_PORT);
                              ^
symbol:   class BrowsermobProxy
location: class Main

Main.java:310: error: cannot find symbol
        HarStorage hs = new HarStorage(HARSTORAGE_HOST, HARSTORAGE_PORT);
        ^
symbol:   class HarStorage
location: class Main

Main.java:310: error: cannot find symbol
        HarStorage hs = new HarStorage(HARSTORAGE_HOST, HARSTORAGE_PORT);
                            ^
symbol:   class HarStorage
location: class Main

4 errors
[sgalkov@zpub zLoadProfilerPkg]$

如果我注释掉“package com.selenium.zLoadProfilerPkg;”在这4个文件中的每一个中并一个一个地编译它们,一切正常。

另外,如果我尝试这样编译:

cd /home/sgalkov/zpp_tech_git_checkout/profiler/zLoadProfiler/zLoadProfiler/src/com/selenium/zLoadProfilerPkg/;

javac -cp ".\
:/home/sgalkov/zpp_tech_git_checkout/profiler/selenium-2.30.0/selenium-java-2.30.0.jar\
:/home/sgalkov/zpp_tech_git_checkout/profiler/selenium-2.30.0/libs/*\
:/home/sgalkov/zpp_tech_git_checkout/profiler/selenium-2.30.0/selenium-server-standalone-2.30.0.jar\
:/home/sgalkov/zpp_tech_git_checkout/profiler/browsermob-proxy-2.0-beta-7/browsermob-proxy-2.0-beta-7-sources.jar\
:/home/sgalkov/zpp_tech_git_checkout/profiler/browsermob-proxy-2.0-beta-7/lib/*\
:/home/sgalkov/zpp_tech_git_checkout/profiler/zLoadProfiler/zLoadProfiler/src/com/selenium/zLoadProfilerPkg" \
BrowsermobProxy.java HarStorage.java HttpRequest.java Main.java

它确实可以编译,但我得到了一个额外的 Main.java 类

 rw-r--r-- 1 sgalkov users  1422 Mar 11 20:30 Main$1.class
 rw-r--r-- 1 sgalkov users  8264 Mar 11 20:30 Main.class
 rw-r--r-- 1 sgalkov users 14864 Mar 11 19:32 Main.java

我无法运行程序,我收到错误:

 Exception in thread "main" java.lang.NoClassDefFoundError: Main (wrong name: com/selenium/zLoadProfilerPkg/Main)
    at java.lang.ClassLoader.defineClass1(Native Method)

我环顾四周并尝试了各种选项,但无法编译该项目,希望得到任何指点。

【问题讨论】:

  • Main$1.class 不是“额外”类,它是一个内部类(通常)。 Main.java 中有内部类吗? (甚至是匿名内部类?)
  • 此外,如果您需要在 *nix shell 中定期构建它,您通常会编写一个小脚本来处理类路径等。或者你可以使用 ant/maven/etc。另一种选择(如果您没有在 *nix 上定期构建它)将只是(咳嗽)从 Eclipse 中导出它(因为您说它在 Eclipse 中工作,所以导出为 JAR)。从 IDE 导出不是一个好习惯,但如果您需要一次性或很少使用它,它会起作用。
  • 感谢我找到了内部类

标签: java linux command-line


【解决方案1】:
dir=/home/sgalkov/zpp_tech_git_checkout/profiler

cd "$dir/zLoadProfiler/zLoadProfiler/src/"

javac -cp ".\
:$dir/selenium-2.30.0/selenium-java-2.30.0.jar\
:$dir/selenium-2.30.0/libs/*\
:$dir/selenium-2.30.0/selenium-server-standalone-2.30.0.jar\
:$dir/browsermob-proxy-2.0-beta-7/browsermob-proxy-2.0-beta-7-sources.jar\
:$dir/browsermob-proxy-2.0-beta-7/lib/*\
:$dir/zLoadProfiler/zLoadProfiler/src/" \
com/selenium/zLoadProfilerPkg/*.java

【讨论】:

  • 这可行,但由于某种原因我仍然得到一个 Main$1.class 文件
  • 有时最短的答案是最好的,因为天才就是简单:)
【解决方案2】:

如果你想在 IDE 之外编译你的应用程序,你应该使用Apache Ant。这是一个示例 build.xml 文件,您可以使用它来使用 Ant 编译您的应用程序。

<?xml version="1.0" encoding="UTF-8"?>
<project basedir="/home/sgalkov/zpp_tech_git_checkout/profiler/zLoadProfiler/zLoadProfiler"
    default="compile">

<property name="dir.prefix" value="/home/sgalkov/zpp_tech_git_checkout/profiler"/>

<path id="compile.classpath">
    <pathelement location="classes"/>
    <fileset dir="${dir.prefix}/selenium-2.30.0">
        <include name="selenium-java-2.30.0.jar"/>
        <include name="libs/*"/>
        <include name="selenium-server-standalone-2.30.0.jar"/>
    </fileset>
    <fileset dir="${dir.prefix}/browsermob-proxy-2.0-beta-7">
        <include name="browsermob-proxy-2.0-beta-7-sources.jar"/>
        <include name="lib/*"/>
    </fileset>
</path>
<property name="compile.classpath" refid="compile.classpath"/>


<target name="compile">
    <mkdir dir="classes"/>
    <javac failonerror="true" srcdir="src" debug="yes"
        includes="**/*.java" destdir="classes"
        classpath="${compile.classpath}">
    </javac>
</target>

<target name="clean">
    <delete dir="classes"/>
</target>

</project>

您的所有类最终都将放在一个名为 classes 的文件夹中,其结构反映了您的源包层次结构。要执行您的应用程序,您只需将classes 文件夹放在您的类路径中,然后将您的主类称为com.selenium.zLoadProfilerPkg.Main。 ant 中有一些不错的功能,例如将您的类打包到 jar 文件中等。看看吧。

至于Main$1.class,请确保您的包定义在每个 java 源文件的顶部正确定义。

另外,请务必检查我提供的 ant 构建脚本中的 compile.classpath,以确保我没有拼错或代表您在问题中提供的类路径中的某些内容。

【讨论】:

    【解决方案3】:

    你必须在有一个子目录com(顶层包)的源根目录中启动javac。您也可以在 Windows 上进行测试。

    您也可以部署已编译的 .class'es/jars/wars/ears。那么就需要编译的目标(1.5,1.6,1.7)。

    是的,ant 或现在的 ma​​ven 可能会在 IDE 内部和独立环境中提供良好的构建基础架构。

    【讨论】:

    • 是的,我同意,ant/maven 是个好主意,但我只是想先完成这项工作 :)
    猜你喜欢
    • 1970-01-01
    • 2014-03-27
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多