Newbie help needed getting setup to build SigTest + discussion about adding a exclude class by name option ...

victor.rudometov at oracle.com victor.rudometov at oracle.com
Tue Jan 5 22:33:54 UTC 2021


Hi Scott,

I would eliminate -exclude java in your setup command making it:

4.  java -Xmx2g -jar $SIGTEST/sigtestdev.jar Setup -classpath 
jakarta.persistence-api-3.0.0.jar:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/jre/lib/jce.jar 
-filename /tmp/jakarta.persistence-api-3.0.0.sig -package jakarta

So the file will store signatures of super classes and interfaces as 
well (from java* packages).

When running the test -package jakarta option will limit testing to 
jakarta package and subpackages. It will check members and super classes 
(so no Map instead of Object is allowed).


Thanks.

Victor.

On 1/5/21 12:35, Scott Marlow wrote:
>
> Hi Victor,
>
> Thank you for the response!
>
> On 12/5/20 3:18 AM, victor.rudometov at oracle.com wrote:
>> Hi Scott,
>>
>> Thank you for your interest in SigTest. Please find my answers below.
>>
>> On 12/3/20 08:03, Scott Marlow wrote:
>>> Hi,
>>>
>>> I'm following the [1] guide to build locally but still have a few 
>>> questions.  Is there a particular version of Apache Ant needed to 
>>> build?  I downloaded 1.9.15 as that should work with Java 7 but am 
>>> getting a build failure [2]:
>>> `
>>> src/com/sun/tdk/signaturetest/ant/ATest.java:165: error: cannot find 
>>> symbol
>>>     [javac]         if (classpath == null || classpath.isEmpty()) {
>>
>> [1] is outdated and needs to be refreshed.
>>
>> I'm using ant 1.10.8 (older ones should work as well) with the 
>> following minimal parameters:
>>
>> ant -f build/build.xml -Djdk7.home=/ws/java/java8 
>> -Djdk8.home=/ws/java/java8 -Djdk9.home=/ws/java/java11
>>
>> Please use Java 8 for jdk7.home. There's probably a way to still use 
>> 7, I have not checked it.
>>
>> You can use Java 9 or higher for jdk9.home, but I would recommend 
>> Java 11 or higher, since 11 is LTS.
>>
>> You can use 15 or 16 too as jdk8.home and jdk9.home if features like 
>> records or sealed types are present in your implementation. Sigtest 
>> supports them.
>>
>
> Thanks, this helped me to build correctly! :)
>
>>
>>> I would like to explore a few ideas with SigTest related to [3] for 
>>> the Jakarta EE Platform TCK which heavily depends on SigTest for 
>>> SPEC API signature testing. Basically, we have users that would like 
>>> to run our TCK against newer versions of Java SE than we have tested 
>>> against. These users like the idea of being able to run the TCKs 
>>> against the very latest Java SE versions.  Since our (Jakarta EE 
>>> Platform TCK) is basically a Java application, it would be very 
>>> useful to be able to run our Jakarta EE Platform EE TCKs against any 
>>> Java SE version that is greater than our base requirement (currently 
>>> we only support Java SE 8 but are working on Java SE 11 now).
>>>
>>> One idea is to create a SigTest pull request for adding an exclude 
>>> class option so that the java.lang.Object public methods/fields will 
>>> be excluded from signature generation/testing.
>>
>> I guess the functionality that you need is already there. You can 
>> specify what should be tested by using -Package and 
>> -PackageWithoutSubpackages options.
>>
>> You can also filter out packages (with subpackages) or individual 
>> classes using -Exclude option.
>
> I tried excluding the `java` package during Setup which seemed to 
> exclude most of the Java SE classes that I wanted to exclude from the 
> generated signature, however then the `java` package classes are 
> missing during the Test command.
>
> Using Java 8, I did the following with a recent local SigTest build:
>
> 1.  cd /tmp
> 2.  wget 
> https://repo1.maven.org/maven2/jakarta/persistence/jakarta.persistence-api/3.0.0/jakarta.persistence-api-3.0.0.jar
> 3.  export SIGTEST=~/SIGTEST_BUILD/release/lib/
> 4.  java -Xmx2g -jar $SIGTEST/sigtestdev.jar Setup -classpath 
> jakarta.persistence-api-3.0.0.jar:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/jre/lib/jce.jar 
> -filename /tmp/jakarta.persistence-api-3.0.0.sig -package jakarta 
> -exclude java
>
> "
> Warning: the created signature file is not transitively-closed
> The signature file contains the following subclasses or subinterfaces 
> of excluded java.io.Serializable:
> java.lang.Class, java.lang.String, java.lang.StackTraceElement, 
> java.util.Calendar, java.util.Date, java.lang.Boolean, 
> java.lang.Character, java.lang.Number, java.net.URL
> ...
> "
>
> On the Test command, I get then get failures :
>
> 5.  java -Xmx2g -jar $SIGTEST/sigtest.jar Test -Static -classpath 
> jakarta.persistence-api-3.0.0.jar:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/jre/lib/jce.jar 
> -filename /tmp/jakarta.persistence-api-3.0.0.sig -package jakarta
>
> "
> The following classes are required, but missing in the signature 
> files:java.lang.Enum, java.lang.annotation.Repeatable, 
> java.lang.annotation.Annotation, java.lang.annotation.Target, 
> java.lang.annotation.Documented, java.lang.Object, 
> java.lang.RuntimeException, java.lang.annotation.Retention
> STATUS:Error.Required classes not found!
> "
>
>
>>
>> If that is not flexible enough there is a possibility to create an 
>> exclude plugin and set it via system property "exclude.plugin". Take 
>> a look at com.sun.tdk.exclude.ExcludeList and -ExcludeSig option 
>> allowing signature exclusions using regexps.
>
> Thanks, I will try using the Exclude extension next via 
> com.sun.tdk.exclude.ExcludeList.  That does seem to be different than 
> excluding the Java SE runtime classes from the generated signature files.
>
> I'm not really sure if the Exclude extension prevents the verification of:
>
> 1.  Jakarta EE SPEC API verification of super class (e.g. 
> java.util.Map or java.lang.Object or some other Java SE runtime class 
> that Jakarta EE SPEC API class "is a descendant of").
>
> 2.  Jakarta EE SPEC API class must have a Java SE runtime class 
> reference (as part of a public field/method).
>
> For example, if we are verifying that the super class of 
> jakarta.persistence.Persistence 
> (https://jakarta.ee/specifications/persistence/3.0/apidocs/jakarta.persistence/jakarta/persistence/persistence) 
> class is java.lang.Object but find that the super class is some 
> unexpected class like java.util.Map, the signature test must still fail.
>
> Scott
>
>>
>>> Imo, this should be a general option that allows a set of classes to 
>>> be excluded (perhaps with some regular expression matching) and also 
>>> allowing the command line exclude option to be specified multiple 
>>> times (for excluding multiple classes by name).
>>>
>>> At least that is one idea.  My preference is to do this work 
>>> upstream first [4].  If there is no interest in the pull request 
>>> being merged, the next option could be forking the SigTest code into 
>>> the jakartaee-tck-tools [5] and making the change there. Either 
>>> option would be easy figure out once we have appropriate changes.
>>
>> Contributions are very much welcome.
>>
>> This mailing list is the best place to discuss new needed things in 
>> SigTest.
>>
>>
>> Thanks.
>>
>> Victor.
>>
>>
>>> One other possible issue or question is whether this exclude class 
>>> option would be a safe option to add to the OpenJDK SigTest tool? 
>>> More specifically, could OpenJDK implementors use such an exclude 
>>> option to cheat the JDK signature tests?  I'm not sure how that 
>>> would happen but if that is a concern, please do speak up about 
>>> that, so we can just proceed to do fork of SigTest.
>>>
>>> From a timing perspective, this `exclude class` change is not 
>>> required at this point in our planning but it would be very very 
>>> nice to have!
>>>
>>> Scott
>>>
>>> [1] https://wiki.openjdk.java.net/display/CodeTools/How+to+build
>>> [2] 
>>> https://gist.github.com/scottmarlow/b48890c8c5365264a4e7ea5c44c0778c
>>> [3] https://github.com/eclipse-ee4j/jakartaee-tck/issues/156
>>> [4] http://hg.openjdk.java.net/code-tools/sigtest
>>> [5] https://github.com/eclipse-ee4j/jakartaee-tck-tools
>>>
>>


More information about the sigtest-dev mailing list