Import StringTemplate:如何从jar导入?

Import StringTemplate:如何从jar导入?,import,stringtemplate-4,Import,Stringtemplate 4,我有一个例子,我正在从jar中包含的文件加载一个字符串模板组。 通过使用以下机制,这可以很好地工作: final String urlName = new StringBuilder() .append("jar:file:").append(templateJar.getAbsolutePath()).append("!") .append(templateFileName).toString(); final URL url; try {

我有一个例子,我正在从jar中包含的文件加载一个字符串模板组。 通过使用以下机制,这可以很好地工作:

final String urlName = new StringBuilder()
            .append("jar:file:").append(templateJar.getAbsolutePath()).append("!")
            .append(templateFileName).toString();
final URL url;
try {
        url = new URL(urlName);
} catch (MalformedURLException ex) {
        throw new GeneratorException("bad manifest url", ex);
}
final STGroup stg = new STGroupFile(url, "US-ASCII", '<', '>');
字符串模板失败,原因如下:

can't load group file jar:file:/home/phreed/.m2/repository/edu/vanderbilt/isis/druid/druid-template/2.0.0/druid-template-2.0.0.jar!/template/src/main/java/sponsor/orm/ContractCreator.stg
Caused by: java.lang.IllegalArgumentException: No such group file: ../../dataTypeMaps.stg
    at org.stringtemplate.v4.STGroupFile.<init>(STGroupFile.java:69)
    at org.stringtemplate.v4.STGroup.importTemplates(STGroup.java:570)
    at org.stringtemplate.v4.compiler.GroupParser.group(GroupParser.java:199)
    at org.stringtemplate.v4.STGroup.loadGroupFile(STGroup.java:619)
    at org.stringtemplate.v4.STGroupFile.load(STGroupFile.java:139)
    at org.stringtemplate.v4.STGroupFile.load(STGroupFile.java:128)
    at org.stringtemplate.v4.STGroup.lookupTemplate(STGroup.java:237)
    at org.stringtemplate.v4.STGroup.getInstanceOf(STGroup.java:172)
    at edu.vanderbilt.isis.druid.generator.Generator.build(Generator.java:215)
    at edu.vanderbilt.isis.druid.generator.DruidMojo.execute(DruidMojo.java:193)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156)
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537)
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:141)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352)
无法加载组文件jar:file:/home/phreed/.m2/repository/edu/vanderbilt/isis/druid/druid-template/2.0.0/druid-template-2.0.0.jar/template/src/main/java/赞助商/orm/ContractCreator.stg
原因:java.lang.IllegalArgumentException:无此类组文件:../../dataTypeMaps.stg
位于org.stringtemplate.v4.STGroupFile。(STGroupFile.java:69)
位于org.stringtemplate.v4.STGroup.importTemplates(STGroup.java:570)
位于org.stringtemplate.v4.compiler.GroupParser.group(GroupParser.java:199)
位于org.stringtemplate.v4.STGroup.loadGroupFile(STGroup.java:619)
位于org.stringtemplate.v4.STGroupFile.load(STGroupFile.java:139)
位于org.stringtemplate.v4.STGroupFile.load(STGroupFile.java:128)
位于org.stringtemplate.v4.STGroup.lookupTemplate(STGroup.java:237)
位于org.stringtemplate.v4.STGroup.getInstanceOf(STGroup.java:172)
位于edu.vanderbilt.isis.druid.generator.generator.build(generator.java:215)
位于edu.vanderbilt.isis.druid.generator.DruidMojo.execute(DruidMojo.java:193)
位于org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101)
位于org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209)
位于org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
位于org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
位于org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84)
位于org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59)
位于org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183)
位于org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161)
在org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320)
在org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156)上
位于org.apache.maven.cli.MavenCli.execute(MavenCli.java:537)
位于org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196)
位于org.apache.maven.cli.MavenCli.main(MavenCli.java:141)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中
位于java.lang.reflect.Method.invoke(Method.java:597)
位于org.codehaus.plexus.classworlds.launcher.launcher.launchEnhanced(launcher.java:290)
位于org.codehaus.plexus.classworlds.launcher.launcher.launch(launcher.java:230)
位于org.codehaus.plexus.classworlds.launcher.launcher.mainWithExitCode(launcher.java:409)
位于org.codehaus.plexus.classworlds.launcher.launcher.main(launcher.java:352)
可以用jar设置一些东西以便导入工作吗?
当不涉及jar时,上述方法可以正常工作。

简单的答案是导入文件的路径错误

...
import "dataTypeMaps.stg"
...
导入将导致从jar的根开始查找文件。 上述导入相当于将文件放置在

final String urlName = new StringBuilder()
        .append("jar:file:").append(templateJar.getAbsolutePath()).append("!")
        .append("dataTypeMaps.stg").toString();
我不知道为什么该行为与模板组文件位于本机文件系统上时不同。 为了让它工作,我修改了类路径以包含jar文件。 由于这是在Maven插件的上下文中完成的,插件需要动态更改类路径。这是用以下代码完成的

 public void setTemplateJarName(String templateJarName) throws GeneratorException {
    this.templateJarName = templateJarName;
    final Thread ct = Thread.currentThread();
    final ClassLoader pcl = ct.getContextClassLoader();
    URL[] nurl;
    try {
        nurl = new URL[]{ new URL("file://"+templateJarName) };
    } catch (MalformedURLException ex) {
        throw new GeneratorException("could not load template jar", ex);
    }
    final URLClassLoader ucl = new URLClassLoader(nurl, pcl);
    ct.setContextClassLoader(ucl);
}
  • 仔细检查您的模板是否真的在jar中
  • 使用以下代码:
  • 如果模板在如下树中调度:

    /-->resources
       +--> c/     (many .st and .stg files)
       +--> cpp/   (many .st and .stg files)
       +--> java/  (many .st and .stg files)
       +--> c.stg
       +--> cpp.stg
       +--> java.stg
    
    java.stg
    的内容是:

    group Java;
    
    import "java"
    
    doNothing() ::= <<>>
    
    groupjava;
    导入“java”
    doNothing():=
    
    要在一次调用中加载所有文件,请执行以下操作:

    URL     url   = getClass().getResource( "/resources/" + templateName );
    STGroup group = new STGroupFile( url, "utf-8", '<', '>' );
    
    URL=getClass().getResource(“/resources/”+templateName);
    STGroup group=新的STGroup文件(url,“utf-8”,“”);
    

    在我的例子中,
    templateName
    等于
    c.stg
    cpp.stg
    java.stg
    ,加载字符串模板组的语义对我来说仍然有点神秘。
    URL     url   = getClass().getResource( "/resources/" + templateName );
    STGroup group = new STGroupFile( url, "utf-8", '<', '>' );