如何在 Windows 中编写 Java 代码并在 Linux 中编译和运行
Posted
技术标签:
【中文标题】如何在 Windows 中编写 Java 代码并在 Linux 中编译和运行【英文标题】:How do I write Java code in Windows and compile and run in Linux 【发布时间】:2010-11-20 04:09:30 【问题描述】:我是一名新的 Java 开发人员,想了解是否可以使用 Eclipse 在 Windows 中编写 Java 代码,并且该代码实际上是在 Linux 上编译和运行的。我需要为Linux(Ubuntu)环境编写java程序,但我习惯于Windows进行开发。
我正在考虑使用 Samba 进行文件共享,因此我可以使用 Windows 访问驻留在 Ubuntu 中的源代码。但是当我编译代码时,它实际上使用的是 Windows JVM,而不是 Ubuntu JVM,这有关系吗?此外,当我需要包含驻留在 Ubuntu 中的外部 JAR 库时,路径实际上类似于 E:\home\java\project\abc.jar,其中 E: 驱动器是来自 Samba 的映射网络驱动器。所以当我在 Ubuntu 上运行程序时,将不再有任何 D: 驱动器。
所以我有点困惑,想知道这是否可能。任何帮助将不胜感激
【问题讨论】:
额外说明,注意不要使用某些“Windows 特定”库,这样做时(即使不太可能发生)。例如,如果您要让自己的外观和感觉,这是一些类依赖于平台的地方。 感谢您的提醒,很高兴知道。但程序是纯服务器端的,所以没有涉及 UI 有趣的一点,帮助答案:您希望如何执行您的代码?它会是主类上的命令行,还是将所有已编译的代码捆绑在一个 jar 中?因为那时的类路径问题略有不同。 根据我阅读的一些教程,可能我会将源代码捆绑到java中并通过linux命令行执行java -jar myprogram。那么“类路径问题略有不同”是什么意思? 也许我现在明白了。这个怎么样,在 Windows 开发环境中,我使用 Eclipse 来包含我需要的任何外部库,编译、运行、测试......但是对于 linux 中的生产,我需要做的就是将我所有的内部代码和外部库包含到一个JAR文件,并在linux上执行这个JAR文件? 【参考方案1】:如果像建议的那样,您将编译后的源代码捆绑在一个 JAR 中,那么您将在这个地方处理这个问题。
JAR 文件包含一个manifest 文件,它描述了内容、公司等。它还包含类路径,以及您需要的外部 jar 的路径。对于您的问题,这些路径将是相对的,并且不包括完整的 D:\ 。
如果您选择使用 Ant 生成您的 JAR,“jar”任务是定义您的 manifest 文件的地方。
例子:
<manifest>
<attribute name="Specification-Title" value="Blablabla description"/>
<attribute name="Class-Path" value="$classpath"/>
</manifest>
在此示例中,“类路径”变量可以是 fileset,其中包括所有外部 jar。
<path id="classpath">
<fileset dir="$project.libdir" includes="*.jar" />
</path>
【讨论】:
【参考方案2】:如果您使用 Eclipse 3.5,请注意有一个新的“Export -> Runnable jar”选项,它是 FatJar 插件的一个子集,允许您导出为单个 jar,也可以作为传统的可执行 jar依赖的 jar 很好地放在了一个子目录中。
我们已经完全切换到后一种模型,因为它很好地符合我们的 ant 脚本,同时完全没有类加载器技巧和其他讨厌的东西。只是普通的“java -jar foo/bar.jar”。
如果适用,强烈推荐。
【讨论】:
我尝试使用“Runnable Jar”,它确实很好地生成了一个 JAR。但实际上 Elipse 中的 .classpath 仍然直接指向我的本地,而不是相对的。如何将路径从绝对更改为相对? 手动修改.classpath 文件?【参考方案3】:因为 Java 是独立于平台的,所以在哪里编译和在哪里运行都没有关系。所以你可以在Windows下编译,在Linux上运行没有问题。
您需要Linux 机器上的库副本以及 和Windows 机器上。这些在哪里无关紧要,但需要通过环境变量CLASSPATH
引用它们。
所以在 Windows 上,您的 CLASSPATH
看起来像:
CLASSPATH=d:\jars\abc.jar;d:\jars\def.jar
在 Unix/Linux 上它看起来像:
CLASSPATH=/home/user/lib/abc.jar:/home/user/lib/def.jar
(注意冒号和分号之间的变化)。
鉴于以上情况,运行
java MyApp.jar
可以在两个平台上运行。全局设置 CLASSPATH 可能会影响不同的 Java 实例,因此您可能希望在调用每个程序的 shell 脚本中设置它。或者您可以在命令行上指定CLASSPATH
,例如
java -cp /home/user/lib/abc.jar:/home/user/lib/def.jar
【讨论】:
如果我设置了 CLASSPATH,我还需要在我的项目中“添加外部 JAR”吗? 环境变量?你的意思是本地的,我猜它包含在 jar 文件的元信息中?因为对系统变量的这种更改意味着只有一个 java 程序可以使用这种特定的类路径运行。 @Gnoupi - 因为 CLASSPATH 指定了 libraries,所以它不做任何假设或断言不限制使用这些程序运行的程序。 但这并不是最干净的方法,因此很容易以拥挤的类路径变量结束。 (+1 用于添加 -cp 参数) @Brian,如果我添加设置 CLASSPATH,我还需要在 Eclipse 中添加外部 JAR 吗?因为该库已被引用到 CLASSPATH。还会有其他java程序在同一台服务器上运行,那么chaing CLASSPATH会影响其他我无法控制的程序吗?【参考方案4】:我认为使用 samba(或任何共享目录)共享源代码是个坏主意。
对文件使用适当的版本控制系统。如果你还没有使用,你真的应该。 (建议:SVN 使用插件 subclipse。)
使用 Eclipse 将项目签出到您的 Windows 机器上的本地工作区。
请记住,Linux 上的文件名区分大小写。尝试使用相对文件名。
如果您是一个项目中唯一的 Windows 开发人员,您可能会遇到比其价值更多的麻烦, 但如果你是一个半正派的开发者,你无论如何都会在几天内学会 Ubuntu。
但是,如果您正在编写自己的应用程序,您可以在 Windows 上编译代码,使用 FatJar plugin 打包它,然后在 linux 机器上执行它。
【讨论】:
感谢 FatJar 插件提示,看来它可以为我节省一些工作 fatjar 功能的子集已合并到 Eclipse 3.5“可运行 jar”支持中。 我尝试使用“Runnable Jar”,它确实很好地生成了一个 JAR。但实际上 Elipse 中的 .classpath 仍然直接指向我的本地,而不是相对的。如何将路径从绝对更改为相对? 手动修改.classpath 文件?【参考方案5】:太麻烦了。为什么不在 ubuntu 上也使用 eclipse?
【讨论】:
因为那不是他的用例?尝试解决问题,而不是用户。 我打算将其添加为评论。但我没有足够的代表分数来做到这一点。 评论或回答,问题是一样的。这就像回答有人寻求 linux 的帮助一样:“太麻烦了,为什么不用 windows 呢?” 嗯,不一样。bcos 我没有建议不同的 IDE。如果您使用 Eclipse 进行开发,它也可以在 linux 上使用。 想要为 Eclipse 进行交叉构建的原因可能有多种。您可以为多种平台构建一个构建服务器。【参考方案6】:编译java时,不使用JVM。它只是将 java 源代码编译为与机器无关的字节码。然后,您可以在任何可以运行 JVM 的机器上运行编译后的 java 字节码。所以从 java 的角度来看,你不应该有任何问题。
【讨论】:
确切地说,编译确实使用JVM来运行编译器(它本身是用Java编写的)。 @Michael - 是的,但这是一个实现细节。例如旧的 Jikes 编译器是原生 C、IIRC。不知道现在是什么情况,用sun的javac确实用到了JVM。【参考方案7】:您应该将Eclipse 用于开发IDE,并将依赖的jar 添加为相对而非完整的目录链接。您可以在 Windows 上编译并在 Linux 上运行。没关系。
【讨论】:
他也可以查看eclipse生成的“.classpath”文件,看是否所有的路径都是相对的。 右击Ecipe中的模块,在右侧的Java Build Path中,选择源选项卡,在此处添加相关文件夹并将您的jar放在此文件夹中。以上是关于如何在 Windows 中编写 Java 代码并在 Linux 中编译和运行的主要内容,如果未能解决你的问题,请参考以下文章
如何将java程序嵌入到网页中去,并在网页中显示出来。 代码如下,拜谢。。。