我正在开发一种通用的Android游戏引擎,它将在我的许多Android应用程序中用作基本系统。问题是,在我的所有Java文件中,我目前必须对软件包名称进行硬编码,如下所示:
package com.example.mygameengine;
但是因为我想在许多不同的应用程序中使用我的通用游戏引擎的代码,我需要找到一种方法来在编译时指定Java文件的包名,因为我不想保留我的几个副本Java源仅仅是因为包名称的不同。我希望有一个中央源代码树,包名称应该可以动态更改,具体取决于我要编译的应用程序。
有没有办法做这样的事情:
package $(PACKAGE_NAME)
在Java源代码中,在编译时将$(PACKAGE_NAME)替换为真实的包名?也许javac有一个选项允许我为它传递的文件指定一个包名,而不是从文件本身中取出它?请注意,我没有使用Eclipse,而是使用ant和make等准系统命令行工具。
编辑:我不明白为什么这被标记为重复。我已经问过一个基本问题,即Java语言中的“package”指令是否需要源代码中的硬编码字符串参数,或者是否也可以在编译时设置此包名称使用编译器指令。那个相当是一个不同的问题,而不是在这里被链接为假定的“原始”问题,而这个问题与Android构建系统关系更紧密。我的问题是关于Java语言的基础知识,而不是关于Android构建系统。
答案 0 :(得分:5)
您可以将您的通用游戏引擎代码构建为独立的JAR。
然后,您可以将其作为依赖项添加到使用它的每个Android应用中。
通过适当的版本控制,您将只有一个存储此代码的中心位置。
答案 1 :(得分:1)
你做不到。而这不是代码重用的正确方法。
只需将常用代码打包到jar中,并将jar包含在您想要的每个项目中(在Android中,您可以通过将类添加到类路径中,然后将其标记为在“Order& Export”选项卡中导出) )
答案 2 :(得分:0)
这是不可能的,因为它是关于你的类的核心元数据的一部分
包是相关Java实体的集合(例如类,接口,异常,错误和枚举)。包用于:
通过在类名前加上包名来解决类的命名冲突。例如,com.zzz.Circle和com.yyy.Circle是两个不同的类。虽然它们共享相同的类名Circle,但它们属于两个不同的包:com.zzz和com.yyy。这两个类可以在同一个程序中使用,并使用完全限定的类名 - 包名和类名来区分。这种机制称为命名空间管理。
访问控制:除了公共和私有之外,Java还有两个与包相关的访问控制修饰符 - 保护和默认。受保护的实体可由同一包及其子类中的类访问。没有访问控制修饰符的实体(即默认值)只能由同一个包中的类访问。
用于分发可重用类的集合,通常采用称为Java Archive(JAR)文件的格式。