2013-01-31 50 views
1

我正在开发一个通用的Android游戏引擎,将在我的许多Android应用程序中用作基本系统。问题是,在我所有的Java文件目前,我有硬编码这样的包名:动态(编译时生成的)Java程序包名称

package com.example.mygameengine; 

但因为我想用我的通用游戏引擎的代码在许多不同的应用程序,我需要找到一种在编译时指定Java文件的包名的方法,因为我不想仅仅因为包名称的不同而保留我的Java源的多个副本。我想要一个中央源代码树,根据我即将编译的应用程序,包名应该可以动态更改。

那么,有没有办法做这样的事情:

package $(PACKAGE_NAME) 

在Java源代码其中$(PACKAGE_NAME)是在编译时与真正的包名被取代?也许javac有一个选项,允许我为它传递的文件指定一个包名称,而不是从文件本身获取它?请注意,我没有使用Eclipse,而是准备了像ant和make这样的命令行工具。

编辑:我不明白为什么这被标记为重复。我问了一个关于Java语言中的“包”指令是否需要源代码中的硬编码字符串参数或者是否可以在编译时使用编译器指令来设置此包名的基本问题。这是相当于这个问题与此处链接的问题不同,它与Android构建系统密切相关的推测性“原始”问题。我的问题是关于Java语言的基础知识,而不是关于Android构建系统。

+2

这是一个非常糟糕的主意。只要在任何地方使用相同的软件包名称,并将相同的类捆绑到不同的应用程序中。这不像你将在每个应用程序中为'java.util'使用不同的包名,是吗? –

+0

我希望你实际上没有使用'com.example'作为你的包前缀。 –

回答

1

你不能。这不是代码重用的正确方法。

只需将常用代码打包到一个jar文件中,并将该jar包含在您想要的每个项目中(在Android中,您可以通过将类添加到classpath中,然后将其标记为导出为“Order & Export”选项卡)

0

这是不可能的,因为它对你的类

一个软件包的核心元数据的一部分是相关的Java实体(如类,接口,异常,错误和枚举)的集合。软件包用于:

通过在类名前加上包名称来解决类的命名冲突。例如,com.zzz.Circle和com.yyy.Circle是两个不同的类。虽然它们共享相同的类名Circle,但它们属于两个不同的包:com.zzz和com.yyy。这两个类可以在同一个程序中使用,并使用完全限定的类名 - 包名和类名进行区分。这种机制被称为名字空间管理。

访问控制:除了公共和私有,Java有两个访问控制修饰符 - 保护和默认 - 与包有关。受保护的实体可以通过同一个包及其子类中的类访问。没有访问控制修饰符的实体(即默认)只能由同一个包中的类访问。

用于分发可重用类的集合,通常采用称为Java归档(JAR)文件的格式。

5

您可以将您的通用游戏引擎代码构建到独立的JAR中。

然后,您可以将它作为依赖项包含在您的每个使用它的Android应用程序中。

通过适当的版本控制,您将只有一个存储此代码的中心位置。

+0

或者即使您不将它放入单独的jar中,也可以在主jar文件中捆绑来自不同包的类。 –