13

几天前,我不得不将 C++ 文件引入 Java 项目时遇到了一个问题。它首先需要测量 Java 进程的 CPU 使用率,然后决定采用 JNI 调用用 C 编写的本机库(Unix 机器上的共享库)。问题是找到一个合适的位置将 C 文件放在仅包含 Java 文件的源存储库(顺便说一下 Clearcase)中。

我想到了几个替代方案:

(a) 创建一个单独的目录,用于将 C 文件(具体来说,一个 .h 文件和一个 .c 文件)放在源代码库的顶部,例如:

/vobs/myproduct/javasrc /vobs/myproduct/cppsrc

我不喜欢这样,因为我只有两个 C 文件,而且像这样在语言级别拆分源代码库似乎很奇怪。如果项目的大部分内容或多或少都是用 C++ 和 Java 编写的,这可能没问题。

(b) 将 C 文件放入使用它的 Java 包中。

我在 /vobs/myproduct/com/mycompany/myproduct/util/ 中有调用 Java 类,C 文件也放在那里。

我也不喜欢这个,因为我认为 C 文件不属于 Java 包。

以前有没有人解决过这样的问题?一般来说,在组织混合两种或多种语言的代码库时,应该遵循什么好的策略?

更新:我没有任何计划在我的项目中使用任何 C 或 C++,也许是一些 Jython,但你永远不知道我的客户何时需要一个只能通过使用 C 来解决或最好通过使用 C 来解决的功能。

4

7 回答 7

8

“我不喜欢这样,因为我只有两个 C 文件,而且像这样在语言级别拆分源代码库似乎很奇怪”

为什么看起来很奇怪?考虑这个项目:

  项目1\src\java
  项目1\src\cpp
  项目 1\src\python

或者,如果您决定将内容拆分为模块:

  项目1\模块1\src\java
  项目1\模块1\src\cpp
  项目1\模块2\src\java
  项目1\模块2\src\python

我想这是个人品味的问题,但上面的结构相当普遍,我认为一旦你习惯了它就会很好地工作。

于 2008-09-24T13:00:52.517 回答
4

Web 应用程序的默认 Maven 生成布局是src/main/javasrc/test/javasrc/main/resourcessrc/test/resources。我会假设它也会默认添加src/main/cppsrc/test/cpp。这对我来说似乎是一个足够体面的约定。

于 2008-09-24T13:09:36.410 回答
1

将它们保存在单独的文件夹中是个好主意。它比在 Java 包中搜索 C 文件更容易找到,并且它还允许将来添加更多 C 代码,而无需稍后移动它。

于 2008-09-24T13:14:37.053 回答
0

就我个人而言,我会将两者分开,甚至可能分成他们自己独立的项目,但那是当它们都是独立的东西时,就像你不会将两个不同的概念放在同一个类中一样。当他们都触及同一个概念领域时,它会变得更加模糊。当然,在构建代码时总是存在问题,例如是否可以将其放入结构 b) 中而无需执行各种技巧来编译它?您是否打算在项目中使用更多 C,在这种情况下,如果您遵循相同的模式,C 文件将遍布您的项目......

于 2008-09-24T12:49:28.770 回答
0

就个人而言,对于拆分语言解决方案,我会将它们保存在单独的项目或文件夹中。

看待问题的一种方法是像对待任何其他第三方 API 一样对待 C 类。在您的 java 代码中接口出依赖项(即避免直接调用)以避免紧密耦合并将 C 源代码保存在与 java.xml 分开的项目/文件夹中。

于 2008-09-24T13:08:35.947 回答
0

让我们使用不同的术语。有一种产品不是项目。该产品由 Java 工作区和 C/C++ 工作区组成,每个工作区都可以从不同的 IDE 加载。最终,如果您使用同一个 IDE,则将只有一个工作区。每个工作区由几个项目组成。每个项目都有自己的文件夹结构(src、bin、res 等)。所以如果它只有一个工作区,那么最好在里面至少有一个Java和一个C/C++项目,每个项目都有不同的编译/运行/调试/输出/...设置。

所以,我会使用:

Product/Workspace(1)/JavaProject1/src 
Product/Workspace(1)/JavaProject2/src 
Product/Workspace(1 or 2)/CPPproject1/src 
Product/Workspace(1 or 2)/CPPproject2/src ...

这样,您最终可以为每个项目使用一个相同的文件夹结构,这更加一致。基本上,这只是又一层抽象——将产品划分为不同的相关项目。

于 2008-09-24T13:09:01.700 回答
0

在这种情况下,有问题的文件不仅是一种不同的语言,而且还作为一个单独的程序运行,通过定义的接口进行交互。这意味着源文件可以被视为一个单独的项目,因此可以保存在其他地方。

在一个代码库中混合 C# 和 ASP.NET(例如)的 .NET 项目中,情况有所不同。在这种情况下,人们如何组织他们的代码?

于 2008-09-24T13:30:44.473 回答