Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法在gradle中进行源代码到源代码的java重构?_Java_Ant_Refactoring_Gradle - Fatal编程技术网

有没有办法在gradle中进行源代码到源代码的java重构?

有没有办法在gradle中进行源代码到源代码的java重构?,java,ant,refactoring,gradle,Java,Ant,Refactoring,Gradle,我得到了一些自动生成的Java代码。我愿意在编译之前自动重构。它主要是类重命名和包修改 是否有任何gradle或ant任务可用于此 我得到了一些自动生成的java代码,我想 在编译之前自动进行重构。它主要是类重命名 和包装修改 [主题外注释:您应该修复生成代码的代码。自动生成代码,然后使用其他工具进行修改看起来不是正确的方法。] Eclipse提供了可在程序中使用(无Eclipse)的。最初的工具是JDT(我曾经使用过),我想新的解决方案是-没有尝试过。您想要的是一个(PTS) PTS读取源代码

我得到了一些自动生成的Java代码。我愿意在编译之前自动重构。它主要是类重命名和包修改

是否有任何gradle或ant任务可用于此

我得到了一些自动生成的java代码,我想 在编译之前自动进行重构。它主要是类重命名 和包装修改

[主题外注释:您应该修复生成代码的代码。自动生成代码,然后使用其他工具进行修改看起来不是正确的方法。]

Eclipse提供了可在程序中使用(无Eclipse)的。最初的工具是JDT(我曾经使用过),我想新的解决方案是-没有尝试过。

您想要的是一个(PTS)

PTS读取源代码,构建程序表示(通常是一个抽象语法树或AST),将转换(通常在“如果您看到了这一点,请将其替换为”目标语言“表面”语法)应用到树中,并可以从修改后的AST重新生成有效的源文本(通常是预打印的)。示例表面语法可以按字面意思编写如下(语法因系统而异):

通常需要一组由元程序控制的协同工作的转换规则来实现更复杂的结果。元程序的编写方式在不同的PTS中有很大的不同

您通常必须配置PTS来解析/预打印所选的目标语言。Stratego、TXL和DMS(我的工具)都已经有Java解析器/预打印器,并且都有表面语法重写。如果选择了PTS,您将生成源代码,然后启动一个流程来运行该工具,使用一组转换和相应的元程序来实现所需的特定代码更改。我相信Stratego有一个Java实现,您可以将它集成到应用程序中,避免单独的过程

一个复杂的问题是,您想要进行的转换通常需要名称解析、类型信息或对代码中的数据流有一些了解。Stratego和TXL没有内置此信息,因此您必须通过编写附加转换按需计算它;这实际上有点难,因为语言语义很复杂。我们的工具DMS已经为Java完成了这些功能,但数据流还有些不完整

如果您的问题实际上只是名称替换,并且名称在生成的代码中是唯一的,那么您可以通过以下转换来解决:

      uniquename1 ==> replacementpath1
e、 g

(如果这真的足够的话,你可能只需要替换文本字符串而不是PTS就可以了。我职业生涯的大部分时间都在发现没有什么事情像我希望的那样简单)

Eclipse的JDT可能是另一种选择。它当然有一个解析器,但没有表面语法转换,所以它不是真正的语法分析器(PTS)。相反,转换是用Java编码的,通过在树上走来走去并使用JDTAPI进行更改,所以这有点痛苦。顺便说一句,它提供了对名称信息的访问,但如果我理解的话,它不提供对表达式类型的访问,并且对数据流没有特定的支持。我理解将它从Eclipse中分离出来作为一个模块使用并不容易;YMMV


以前有一个名为的独立工具,它提供了Java解析、全名和类型解析,但对过程树进行了修改。我不知道您是否跟踪了Java的现代方言(例如,1.5及以上版本的模板)。

您可以在使用proguard编译后执行此操作。proguard有一个gradle任务。

正如您所说,您使用“xjc”生成代码,并且您希望“主要是类重命名和包修改”,也许一些“xjc”选项可以满足您的需要:

-p <pkg>           :  specifies the target package
-b <file/dir>      :  specify external bindings files (each <file> must have its own -b)
                      If a directory is given, **/*.xjb is searched
-p:指定目标包
-b:指定外部绑定文件(每个文件都必须有自己的-b)
如果给定了目录,则搜索***.xjb
使用“-p”可以定义生成的代码应该属于的目标包。有关使用绑定选项的详细信息,请查看此处

编辑另一种方法是:将生成的文件移动到所需目录中,然后使用替换插件替换复制的源文件中的包规范

<plugin>
   <artifactId>maven-resources-plugin</artifactId>
   <executions>
      <execution>
         <id>copy-resources</id>
         <phase>process-resources</phase>
         <goals>
            <goal>copy-resources</goal>
         </goals>
         <configuration>
            <outputDirectory>the.directory.for.the.classes.to.move.to</outputDirectory>
            <resources>
               <resource>
                  <directory>the.directory.of.ajc.classes</directory>
                  ... do here the appropriate settings ...
               </resource>
            </resources>
         </configuration>
      </execution>
   </executions>
</plugin>

<plugin>
    <groupId>com.google.code.maven-replacer-plugin</groupId>
    <artifactId>replacer</artifactId>
    <version>1.5.2</version>
    <executions>
        <execution>
            <phase>process-sources</phase>
            <goals>
                <goal>replace</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <includes>
            <include>**/src/main/gen/**/**.java</include>
        </includes>
        <token>^package the.one.you.want.to.replace</token>
        <value>package you.want.the.classes.to.be</value>
        <regexFlags>
            <regexFlag>MULTILINE</regexFlag>
        </regexFlags>
    </configuration>
</plugin>

maven资源插件
复制资源
过程资源
复制资源
.directory.for.the.classes.to.move.to
.directory.of.ajc.classes
... 在这里做适当的设置。。。
com.google.code.maven-replacer-plugin
替代者
1.5.2
过程源
代替
**/src/main/gen/**/**.java
^打包.one.you.want.to.replace
包you.want.the.classes.to.be
多行

如果您试图控制由xjc生成的包和类名,您可以提供一个

你会这样说:

<jxb:bindings version="1.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <jxb:bindings schemaLocation="your.xsd" node="/xs:schema">
    <jxb:schemaBindings>
      <jxb:package name="the.package.name.you.want" />
    </jxb:schemaBindings>
  </jxb:bindings>
</jxb:bindings>

有一种工具叫勺子。这个项目是开源的,使您能够用一种源到源的方法转换和分析Java源代码。它提供了一个完整的、细粒度的Java元模型,其中可以访问任何程序元素(类、方法、字段、语句、表达式……)进行读取和修改

您可以在其网站上获得更多信息:

要使用Gradle运行spoon,您可以在项目中插入一个插件,并在其上应用spoon。要使用它,请克隆此项目()并在本地存储库上安装插件(
/gradlew install
)。之后,您可以将其插入o
<plugin>
   <artifactId>maven-resources-plugin</artifactId>
   <executions>
      <execution>
         <id>copy-resources</id>
         <phase>process-resources</phase>
         <goals>
            <goal>copy-resources</goal>
         </goals>
         <configuration>
            <outputDirectory>the.directory.for.the.classes.to.move.to</outputDirectory>
            <resources>
               <resource>
                  <directory>the.directory.of.ajc.classes</directory>
                  ... do here the appropriate settings ...
               </resource>
            </resources>
         </configuration>
      </execution>
   </executions>
</plugin>

<plugin>
    <groupId>com.google.code.maven-replacer-plugin</groupId>
    <artifactId>replacer</artifactId>
    <version>1.5.2</version>
    <executions>
        <execution>
            <phase>process-sources</phase>
            <goals>
                <goal>replace</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <includes>
            <include>**/src/main/gen/**/**.java</include>
        </includes>
        <token>^package the.one.you.want.to.replace</token>
        <value>package you.want.the.classes.to.be</value>
        <regexFlags>
            <regexFlag>MULTILINE</regexFlag>
        </regexFlags>
    </configuration>
</plugin>
<jxb:bindings version="1.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <jxb:bindings schemaLocation="your.xsd" node="/xs:schema">
    <jxb:schemaBindings>
      <jxb:package name="the.package.name.you.want" />
    </jxb:schemaBindings>
  </jxb:bindings>
</jxb:bindings>
<jxb:bindings node="//xs:complexType[@name='UglyTypeName']">
  <jxb:class name="MyNiceClass"/>
</jxb:bindings>
xjc your.xsd -b bindings.xjb