javac:如何在多个目录中编译多个类?

时间:2017-07-27 16:58:59

标签: java javac

我正在尝试创建客户端 - 服务器架构,我只想使用javac来编译我的代码。我想要这些目录树:

<ProjectExtensions>
  <VisualStudio>
    <FlavorProperties GUID="{BAA0C2D2-18E2-41B9-852F-F413020CAA33}">
      <ProjectProperties HostName="Word" HostPackage="{29A7B9D7-A7F1-4328-8EF0-6B2D1A56B2C1}" OfficeVersion="" VstxVersion="4.0" ApplicationType="Word" Language="cs" TemplatesPath="VSTOTemplates" DebugInfoExeName="#Software\Microsoft\Office\14.0\Word\InstallRoot\Path#WINWORD.EXE" DebugInfoCommandLine="/w" AddItemTemplatesGuid="{51063C3A-E220-4D12-8922-BDA915ACD783}" />
      <Host Name="Word" GeneratedCodeNamespace="my_namespace_here" PublishedHash="AAAAAAAAAAAAAAA2FBF2B7EA72250886FF164DE6" IconIndex="0">
        <HostItem Name="ThisAddIn" Code="ThisAddIn.cs" CanonicalName="AddIn" PublishedHash="595051696E85B8CAE7EDD3B5EDE7B729864BC855" CanActivate="false" IconIndex="1" Blueprint="ThisAddIn.Designer.xml" GeneratedCode="ThisAddIn.Designer.cs" />
      </Host>
    </FlavorProperties>
  </VisualStudio>
</ProjectExtensions>

我想在服务器中使用Constant和Packet类,而不是在客户端,但是使用javac我无法做到。我真的无法理解包和导入关键字的工作原理。例如,我无法理解为什么下面的代码是错误的:

小型服务器代码:

/Project/Server/src/Server.java
                   /ClientConnection.java
               /bin/Server.class
                   /ClientConnection.Class

        /Global/src/Constants.java
                   /Packet.java
               /bin/Constants.class
                   /Packet.Class

        /Client/src/(it doesn't matter at the moment)
               /bin/(it doesn't matter at the moment)

编译命令和相对错误:

import Global.src.Constants;
import Server.src.*

public class Server extends ThreadPoolExecutor{
   private Iterator<ClientConnection> iterator;
   private NodeServer[] map;
   private ServerSocket listener;
   private ArrayList<ClientConnection> clients;
   private HashSet<ClientConnection> clientsDisconnected;

任何人都可以帮助我拥有之前描述的目录结构吗?

提前谢谢!

贝壳我喜欢你的解决方案,但我不明白如何应用它。我创建了common.jar文件,但我不知道如何导入它。此外,我还不知道是否需要创建一个包。你能给我任何澄清吗?

2 个答案:

答案 0 :(得分:0)

尝试使用多个文件。

javac file1.java file2.java (space is needed b/w file names)

或当前目录中的所有文件

javac *

答案 1 :(得分:0)

按照以下方式行事。在您的情况下,您的代码具有依赖性(服务器依赖于全局,客户端可能依赖于全局和服务器)。你需要按顺序编译。

javac -d Project/Global/bin Project/Global/src/*.java
javac -d Project/Server/bin -cp Project/Global/bin Project/Server/src/*

这样,全局代码将放在bin中,并将在服务器编译期间通过类路径使用。

如果你想使用javac并且你的源中有嵌套目录,你可以使用find

find Project/Global/src "*.java" -exec javac -d Project/Global/bin {} \;

至于错误:

Server.java:1: error: cannot access Constants
   import Global.src.Constants;

我想你想要略有不同的源结构。 E.g。

Project
  +-Global
    +-src
      +-some_package

然后,在Constants.java中你可以放

/* Constants.java */

package some_package;

public class Constants { ... }

然后,在您要导入的代码中

import some_package.Constants;