Java程序在文件夹之间拆分

时间:2019-07-15 12:29:27

标签: java compilation runtime-compilation

所以我想开发一个小型游戏引擎。它具有诸如Vector和Actor之类的主要引擎类供用户使用。由于我只需要引擎一次,因此我想使游戏使用相同的引擎,并且为了避免将所有游戏都放在同一个jar中,我打算将它们放在单独的文件夹中,一个与引擎一起放置,然后为每个游戏放置一个文件夹。 。然后,发动机应该能够加载例如。另一个文件夹中的Player类并加以利用。

我认为一种解决方案可能是在运行时编译游戏文件夹。但是问题是文件彼此依赖,并且依赖于JVM中已经加载的已编译类。对于这种方法:

因此,作为一个示例,我们有三个类:引擎中的Actor,扩展用户编写的引擎actor类的Player,第三类(用户编写的项目)在Player中生成,但又一次需要Player进行编译,这意味着它们不能一个接一个地编译。

据我了解,当我们运行程序时,Actor已经在JVM中进行了编译。现在,我们知道了一个包含所有要编译类的文件夹,其中Player取决于JVM中的已编译类,而文件夹中的未编译类则取决于Player。

现在,我想编译Player类,在此我们还必须编译Item,然后实例化Player,以便我们可以四处移动并生成项目。

这是我的意思的基本示例:

// already compiled in eg. executing jar file 
class MainStuff
{
    public static void main(String args[])
    {
        String FolderOfUncompiledClasses = "Some/folder/to/src/";
        Class<?>[] CompiledClasses = CompileFolderContents(FolderOfUncompiledClasses);
        // iterating through compiled classes
        for (Class<?> C : CompiledClasses)
        {
            // if we have an Actor class, we create a new instance
            if (C.isAssignableFrom(Actor.class))
            {
                try
                {
                    C.getDeclaredConstructor().newInstance();
                } catch (InstantiationException | IllegalAccessException | IllegalArgumentException
                        | InvocationTargetException | NoSuchMethodException | SecurityException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }

    // should compile all the files and returns the classes of the compiled java files

    private static Class<?>[] CompileFolderContents(String Folder)
    {
        File[] JavaFiles = new File(Folder).listFiles();

        Class<?>[] CompiledClasses = new Class<?>[JavaFiles.length];

        for (int i = 0; i < JavaFiles.length; i++)
        {
            Class<?> CompiledClass = DoCompilationStuff(JavaFiles[i]);
            CompiledClasses[i] = CompiledClass;
        }
        return CompiledClasses;
    }

    // this should effectively compile the class which it can both use non compiled
    // java files in the folder and already compiled classes
    private static Class<?> DoCompilationStuff(File ToCompile)
    {
        return null;
    }
}

// already compiled in eg. executing jar file
class Actor
{
    int X, Y;
}

在驱动器上某个文件夹中:

// not compiled
class Player extends Actor
{
    public Player()
    {
        // uses other non compiled class
        new Item();
    }
}

// not compiled
class Item
{
   // Also uses Actor so we can't compile them in series
   public Item(Player P)
   {
   }
}

我尝试使用javac命令,但是我无法使其以某种方式与整个文件夹结构一起使用。

我希望我能以合理的方式解释它,如果这种方法没有意义。这只是一个想法,如果您有更好的方法,我会很高兴听到它。

非常感谢您!

1 个答案:

答案 0 :(得分:1)

如果确实需要使用javac,则将类保留在相同的package和目录中。这样可以简化构建过程,而不必使用-cp参数来指定存在于多个不同目录中的类路径。

我建议您不要使用手动编译方法,而应使用构建系统来设置项目,例如Gradle。如果您查看Building Java Applications Gradle文档,则大约需要10分钟,并且应该拥有所需的一切:构建,测试和打包。