Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8043311 JEP 199: Smart Java Compilation, Phase Two
  3. JDK-8054717

SJavac should track changes in the public apis of classpath classes!

    XMLWordPrintable

    Details

    • Type: Sub-task
    • Status: Closed
    • Priority: P3
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: 9
    • Component/s: tools
    • Labels:
    • Subcomponent:
    • Resolved In Build:
      b69
    • Verification:
      Verified

      Backports

        Description

        sjavac should track the public apis of the classes in the classpath, that the previous compiles has linked to. If the public api of the linked to classes has changed, then this should trigger a recompile of the appropriate sources.

        This is a very useful feature. Currently sjavac must be fed all sources that belong to the product in a single huge compile. The OpenJDK is already at the limit of what fits in a reasonable (of today) sized Java heap.
        Other products are significantly larger and therefore cannot make use of the incremental compile in sjavac.

        With this feature, it is possible to compile the product as separate jar files, as long as the build dependencies for the jar files are a directed acyclic graph, then each succesive compile will detect if there were any changes in the public apis of the dependency jar files. If the public apis of the dependencies were not changed, and there were no other source changes for that jar, it will not be recompiled! But if there were changes in the public apis of the dependencies, then only the appropriate parts of the jar will be recompiled!

        This is solved by storing (in the javac_state file) references to classes on the classpath with the timestamp of the class and the jar. If the jar timestamp is not changed, then no further checking is done, if the jar timestamp is changed, then the class timestamps are checked, if a class timestamp is changed, then the public api is calculated and compared with the value in the javac_state file.

        Previously javac_state contained a textual representation of the public api. This is no longer possible since the classpath public apis are huge! Instead the hash of the textual representation for each class is stored in the javac_state file.





          Attachments

            Issue Links

              Activity

                People

                Assignee:
                alundblad Andreas Lundblad (Inactive)
                Reporter:
                ohrstrom Fredrik Öhrström
                Votes:
                0 Vote for this issue
                Watchers:
                3 Start watching this issue

                  Dates

                  Created:
                  Updated:
                  Resolved: