如何在Windows中编写Java代码并在Linux上编译和运行

3

我是一名新的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特定”的库时要小心,即使这种情况不太可能发生。例如,如果您想创建自己的外观和感觉,这是一些类依赖于平台的地方。 - Gnoupi
谢谢提醒,知道了。但是这个程序完全是服务器端的,所以没有涉及到用户界面。 - Beier
有趣的观点,帮助回答:你想如何执行你的代码?它会在主类上使用命令行,还是将所有编译后的代码捆绑在一个jar包中?因为类路径问题略有不同。 - Gnoupi
根据我阅读的一些教程,我可能会将源代码打包成Java并通过Linux命令行执行java -jar myprogram那么你所说的“类路径问题略有不同”是什么意思? - Beier
也许我现在明白了。在Windows开发环境中,我使用Eclipse来包含我需要的任何外部库,编译,运行,测试...但是在Linux生产环境中,我只需要将所有内部代码和外部库包含到一个JAR文件中,然后在Linux上执行JAR文件就可以了? - Beier
请注意,JAR文件可以引用其他JAR文件,但不能包含其他JAR文件。 - Brian Agnew
7个回答

8
由于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文件”? - Beier
环境变量?你是指本地的那个吧,它包含在JAR文件的元信息中,是这样吧?因为对系统变量进行这样的更改将意味着只有一个Java程序可以使用具有特定类路径的变量运行。 - Gnoupi
@Gnoupi - 因为CLASSPATH指定了,它不会对使用这些库的程序做任何假设或限制。 - Brian Agnew
但这并不是最干净的方法,很容易导致类路径变量混乱。 (+1 添加-cp参数) - Gnoupi
@Gnoupi - 是的,你说得对,CLASSPATH 可能会变得混乱不堪。因此,我会针对每个应用程序设置每次调用 Shell 脚本的 CLASSPATH,或者针对每个用户设置 CLASSPATH(如果该机器上的用户帐户运行使用相同库集的相关内容,虽然这种情况并不常见)。 - Brian Agnew
显示剩余2条评论

7

在开发IDE方面,建议您使用Eclipse,并将依赖的JAR包添加为相对路径而非完整路径链接。这样您可以在Windows上编译,在Linux上运行,不会有任何问题。


他还可以检查Eclipse生成的“.classpath”文件,看看所有路径是否都是相对路径。 - Gnoupi
在Eclipse中右键点击模块,在右侧的Java Build Path中选择源选项卡,添加相对文件夹并将您的JAR包放入此文件夹中。 - firstthumb

3

编译Java代码时并不会使用JVM。它只是将Java源代码编译为字节码,这应该是与机器无关的。你可以在任何能够运行JVM的机器上运行已编译的Java字节码。因此,从Java的角度来看,你不应该遇到任何问题。


3
确切地说,编译确实使用JVM来运行编译器(编译器本身是用Java编写的)。 - Michael Borgwardt
@Michael - 是的,但那只是一個實現細節。例如,舊的 Jikes 編譯器是本機 C 實現的,如果我沒有記錯的話。我不知道現在的情況是什麼,使用 Sun 的 javac 確實會使用 JVM。 - Brian Agnew

2
如果您使用的是Eclipse 3.5,请注意有一个新的“导出->可运行jar”选项,它是FatJar插件的子集,允许您将其导出为单个jar文件,并作为传统的可执行jar文件,所有依赖的jar文件都被放置在子目录中。
我们已经完全转向后一种模型,因为它与我们的ant脚本非常相符,同时完全没有类加载器技巧和其他不良影响。只需使用普通的“java -jar foo/bar.jar”。
如果适用的话,强烈建议使用。

我尝试使用“Runnable Jar”,它确实很好地生成了一个JAR文件。但是实际上,Eclipse中的.classpath仍然指向我的本地目录,而不是相对路径。我该如何将路径从绝对路径更改为相对路径?通过手动修改.classpath文件吗? - Beier

1

如果像建议的那样,您将在JAR中捆绑编译源代码,则需要在此处处理该问题。

JAR文件包含一个清单文件,其中描述了内容、公司等。它还包含类路径,其中包括您需要的外部JAR的路径。这些路径将是相对的,并且不会包括完整的D:\ something。

如果选择使用Ant生成您的JAR,则“jar”任务是定义清单文件的地方。

例如:

<manifest>
    <attribute name="Specification-Title" value="Blablabla description"/>
    <attribute name="Class-Path" value="${classpath}"/>
</manifest>

在这个例子中,“classpath”变量可以是一个fileset,其中包含了你所有的外部jar包。
<path id="classpath">
    <fileset dir="${project.libdir}" includes="*.jar" />
</path>

1

我认为使用Samba(或任何共享目录)分享源代码是一个不好的主意。

应该使用适当的版本控制系统来管理文件。如果你还没有使用,那么你真的应该使用一个。(建议:使用Subclipse插件的SVN)

使用Eclipse将项目检出到本地工作区中的Windows机器上。

请记住,在Linux上文件名是区分大小写的。尽量使用相对文件名。

如果你是项目中唯一的Windows开发人员,那么你可能会遇到比它值得的更多麻烦,但如果你是一个合格的开发人员,你会在几天内学会Ubuntu。

然而,如果你正在做自己的应用程序,你可以在Windows上编译代码,使用例如FatJar插件打包,然后在Linux机器上执行。


感谢您提供的FatJar插件提示,看起来它可以为我节省一些工作。 - Beier
Eclipse 3.5中已经合并了Fatjar功能的子集,支持“Runnable jar”。 - Thorbjørn Ravn Andersen
我尝试使用“Runnable Jar”,它确实很好地生成了一个JAR文件。但是实际上,Eclipse中的.classpath仍然指向我的本地目录,而不是相对路径。我该如何将路径从绝对路径更改为相对路径?通过手动修改.classpath文件吗? - Beier

-3

太麻烦了。为什么不在Ubuntu上也使用Eclipse呢?


2
因为那不是他的使用情况?尝试解决问题,而不是用户。 - Gnoupi
1
我本来想把它作为评论添加。但是我没有足够的声望分数来这样做。 - krishna
1
评论或回答,问题是相同的。这就像回答某人关于Linux求助的问题:“太麻烦了,为什么不使用Windows?” - Gnoupi
好的,它们并不相同。因为我没有建议使用不同的IDE。如果您正在使用Eclipse进行开发,它也可以在Linux上使用。 - krishna
1
可能有多种原因让人们想要为Eclipse进行交叉编译。您可以让构建服务器为多个平台构建应用程序。 - Anders Hansson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接