Class AbstractBuild<P extends AbstractProject<P,R>,R extends AbstractBuild<P,R>>
- java.lang.Object
-
- hudson.model.AbstractModelObject
-
- hudson.model.Actionable
-
- hudson.model.Run<P,R>
-
- hudson.model.AbstractBuild<P,R>
-
- All Implemented Interfaces:
ExtensionPoint
,DescriptorByNameOwner
,ModelObject
,PersistenceRoot
,Queue.Executable
,Saveable
,SearchableModelObject
,SearchItem
,AccessControlled
,Comparable<R>
,Runnable
,LazyBuildMixIn.LazyLoadingRun<P,R>
,ModelObjectWithContextMenu
,RunWithSCM<P,R>
,OnMaster
,org.kohsuke.stapler.StaplerProxy
- Direct Known Subclasses:
Build
public abstract class AbstractBuild<P extends AbstractProject<P,R>,R extends AbstractBuild<P,R>> extends Run<P,R> implements Queue.Executable, LazyBuildMixIn.LazyLoadingRun<P,R>, RunWithSCM<P,R>
Base implementation ofRun
s that build software. For now this is primarily the common part ofBuild
and MavenBuild.- Author:
- Kohsuke Kawaguchi
- See Also:
AbstractProject
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description class
AbstractBuild.AbstractBuildExecution
class
AbstractBuild.AbstractRunner
Deprecated.as of 1.467 Please useRun.RunExecution
static class
AbstractBuild.DependencyChange
Represents a change in the dependency.-
Nested classes/interfaces inherited from class hudson.model.Run
Run.Artifact, Run.ArtifactList, Run.KeepLogBuildBadge, Run.RedirectUp, Run.RunExecution, Run.Runner, Run.RunnerAbortedException, Run.StatusSummarizer, Run.Summary
-
Nested classes/interfaces inherited from interface hudson.ExtensionPoint
ExtensionPoint.LegacyInstancesAreScopedToHudson
-
Nested classes/interfaces inherited from interface jenkins.model.ModelObjectWithContextMenu
ModelObjectWithContextMenu.ContextMenu, ModelObjectWithContextMenu.ContextMenuVisibility, ModelObjectWithContextMenu.MenuItem, ModelObjectWithContextMenu.MenuItemType
-
-
Field Summary
Fields Modifier and Type Field Description protected List<Environment>
buildEnvironments
During the build this field remembersBuildWrapper.Environment
s created byBuildWrapper
.-
Fields inherited from class hudson.model.Run
ARTIFACTS, charset, DELETE, description, duration, FEED_ADAPTER, FEED_ADAPTER_LATEST, LIST_CUTOFF, nextBuild, number, ORDER_BY_DATE, PERMISSIONS, previousBuild, project, QUEUE_ID_UNKNOWN, result, SKIP_PERMISSION_CHECK, timestamp, TREE_CUTOFF, UPDATE, XSTREAM, XSTREAM2
-
-
Constructor Summary
Constructors Modifier Constructor Description protected
AbstractBuild(P job)
protected
AbstractBuild(P project, File buildDir)
protected
AbstractBuild(P job, Calendar timestamp)
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Deprecated Methods Modifier and Type Method Description void
addAction(Action a)
Adds a new action.Set<User>
calculateCulprits()
Method used for actually calculating the culprits from scratch.protected BuildReference<R>
createReference()
Called byRunMap
to obtain a reference to this run.org.kohsuke.stapler.HttpResponse
doStop()
Stops this build if it's still going.void
doStop(org.kohsuke.stapler.StaplerRequest req, org.kohsuke.stapler.StaplerResponse rsp)
Deprecated.as of 1.489 UsedoStop()
protected void
dropLinks()
Called byRunMap
to drop bi-directional links in preparation for deleting a build.Calendar
due()
Action
getAggregatedTestResultAction()
Deprecated.UseActionable.getAction(Class)
onAggregatedTestResultAction
.VariableResolver<String>
getBuildVariableResolver()
CreatesVariableResolver
backed bygetBuildVariables()
.Map<String,String>
getBuildVariables()
Provides additional variables and their values toBuilder
s.Node
getBuiltOn()
Returns aSlave
on which this build was done.String
getBuiltOnStr()
Returns the name of the agent it was built on; null or "" if built by the built-in node.ChangeLogSet<? extends ChangeLogSet.Entry>
getChangeSet()
Gets the changes incorporated into this build.List<ChangeLogSet<? extends ChangeLogSet.Entry>>
getChangeSets()
Gets allChangeLogSet
s currently associated with this item.Set<String>
getCulpritIds()
Gets the ids for allUser
s included inRunWithSCM.getChangeSets()
for this item.Set<User>
getCulprits()
List of users who committed a change since the last non-broken build till now.Map<AbstractProject,AbstractBuild.DependencyChange>
getDependencyChanges(AbstractBuild from)
Gets the changes in the dependency between the given build and this build.Map<AbstractProject,Fingerprint.RangeSet>
getDownstreamBuilds()
Gets the downstream builds of this build, which are the builds of the downstream projects that use artifacts of this build.Iterable<AbstractBuild<?,?>>
getDownstreamBuilds(AbstractProject<?,?> that)
Works likegetDownstreamRelationship(AbstractProject)
but returns the actual build objects, in ascending order.Fingerprint.RangeSet
getDownstreamRelationship(AbstractProject that)
Gets the dependency relationship from this build (as the source) and that project (as the sink.)EnvVars
getEnvironment(TaskListener log)
Returns the map that contains environmental variables to be used for launching processes for this build.EnvironmentList
getEnvironments()
During the build, expose the environments contributed byBuildWrapper
s and others.String
getHudsonVersion()
Gets the version of Hudson that was used to build this job.FilePath
getModuleRoot()
Returns the root directory of the checked-out module.FilePath[]
getModuleRoots()
Returns the root directories of all checked-out modules.R
getNextBuild()
Queue.Executable
getParentExecutable()
An umbrella executable (such as aRun
) of which this is one part.List<Action>
getPersistentActions()
R
getPreviousBuild()
P
getProject()
AbstractBuild<?,?>
getRootBuild()
Gets the nearest ancestorAbstractBuild
that belongs to the root project of getProject() that dominates/governs/encompasses this build.LazyBuildMixIn.RunMixIn<P,R>
getRunMixIn()
Set<String>
getSensitiveBuildVariables()
Builds up a set of variable names that contain sensitive values that should not be exposed.Action
getTestResultAction()
Deprecated.UseActionable.getAction(Class)
onAbstractTestResultAction
.Map<AbstractProject,Integer>
getTransitiveUpstreamBuilds()
Works likegetUpstreamBuilds()
but also includes all the transitive dependencies as well.Map<AbstractProject,Integer>
getUpstreamBuilds()
Gets the upstream builds of this build, which are the builds of the upstream projects whose artifacts feed into this build.int
getUpstreamRelationship(AbstractProject that)
Gets the dependency relationship from this build (as the sink) and that project (as the source.)AbstractBuild<?,?>
getUpstreamRelationshipBuild(AbstractProject<?,?> that)
Works likegetUpstreamRelationship(AbstractProject)
but returns the actual build object.String
getUpUrl()
Deprecated.navigation through a hierarchy should be done through breadcrumbs, do not add a link using this methodString
getWhyKeepLog()
IfRun.isKeepLog()
returns true, returns a short, human-readable sentence that explains why it's being kept.FilePath
getWorkspace()
Gets the directory where this build is being built.boolean
hasChangeSetComputed()
Returns true if the changelog is already computed.abstract void
run()
Invoked byExecutor
to performs a build.protected void
setBuiltOnStr(String builtOn)
Allows subtypes to set the value ofbuiltOn
.protected void
setWorkspace(FilePath ws)
Normally, a workspace is assigned byRun.RunExecution
, but this lets you set the workspace in caseAbstractBuild
is created without a build.boolean
shouldCalculateCulprits()
Determines whether culprits should be recalcuated or the existingRunWithSCM.getCulpritIds()
should be used instead.-
Methods inherited from class hudson.model.Run
_this, canToggleLogKeep, compareTo, delete, deleteArtifacts, doArtifact, doBuildNumber, doBuildStatus, doBuildTimestamp, doConfigSubmit, doConsoleText, doDoDelete, doProgressiveLog, doSubmitDescription, doToggleLogKeep, execute, fromExternalizableId, getAbsoluteUrl, getACL, getApi, getArtifactManager, getArtifacts, getArtifactsDir, getArtifactsUpTo, getBadgeActions, getBuildFingerprints, getBuildsOverThreshold, getBuildStatusIconClassName, getBuildStatusSummary, getBuildStatusUrl, getCause, getCauses, getCharacteristicEnvVars, getCharset, getDescription, getDisplayName, getDuration, getDurationString, getDynamic, getEnvironment, getEnvVars, getEstimatedDuration, getExecutor, getExternalizableId, getFullDisplayName, getHasArtifacts, getIconColor, getId, getLog, getLog, getLogFile, getLogInputStream, getLogReader, getLogText, getNumber, getOneOffExecutor, getParent, getPreviousBuildInProgress, getPreviousBuildsOverThreshold, getPreviousBuiltBuild, getPreviousCompletedBuild, getPreviousFailedBuild, getPreviousNotFailedBuild, getPreviousSuccessfulBuild, getQueueId, getResult, getRootDir, getSearchUrl, getStartTimeInMillis, getTarget, getTime, getTimeInMillis, getTimestamp, getTimestampString, getTimestampString2, getTransientActions, getTruncatedDescription, getUrl, hasCustomDisplayName, hasntStartedYet, isBuilding, isInProgress, isKeepLog, isLogUpdated, keepLog, keepLog, makeSearchIndex, onEndBuilding, onLoad, onStartBuilding, pickArtifactManager, reload, run, save, setDescription, setDisplayName, setQueueId, setResult, submit, toString, updateSymlinks, writeLogTo, writeReplace, writeWholeLogTo
-
Methods inherited from class hudson.model.Actionable
addOrReplaceAction, doContextMenu, getAction, getAction, getActions, getActions, getAllActions, removeAction, removeActions, replaceAction, replaceActions
-
Methods inherited from class hudson.model.AbstractModelObject
getSearch, getSearchIndex, getSearchName, requirePOST, sendError, sendError, sendError, sendError, sendError
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
-
Methods inherited from interface hudson.security.AccessControlled
checkAnyPermission, checkPermission, hasAnyPermission, hasPermission, hasPermission, hasPermission2
-
Methods inherited from interface hudson.model.DescriptorByNameOwner
getDescriptorByName
-
Methods inherited from interface hudson.model.Queue.Executable
getEstimatedDuration, getParent, toString
-
Methods inherited from interface jenkins.scm.RunWithSCM
hasParticipant
-
-
-
-
Field Detail
-
buildEnvironments
protected transient List<Environment> buildEnvironments
During the build this field remembersBuildWrapper.Environment
s created byBuildWrapper
. This design is bit ugly but forced due to compatibility.
-
-
Constructor Detail
-
AbstractBuild
protected AbstractBuild(P job) throws IOException
- Throws:
IOException
-
AbstractBuild
protected AbstractBuild(P project, File buildDir) throws IOException
- Throws:
IOException
-
-
Method Detail
-
getProject
public final P getProject()
-
getRunMixIn
public final LazyBuildMixIn.RunMixIn<P,R> getRunMixIn()
- Specified by:
getRunMixIn
in interfaceLazyBuildMixIn.LazyLoadingRun<P extends AbstractProject<P,R>,R extends AbstractBuild<P,R>>
-
createReference
@NonNull protected final BuildReference<R> createReference()
Description copied from class:Run
Called byRunMap
to obtain a reference to this run.- Overrides:
createReference
in classRun<P extends AbstractProject<P,R>,R extends AbstractBuild<P,R>>
- Returns:
- Reference to the build. Never null
- See Also:
LazyBuildMixIn.RunMixIn.createReference()
-
dropLinks
protected final void dropLinks()
Description copied from class:Run
Called byRunMap
to drop bi-directional links in preparation for deleting a build.- Overrides:
dropLinks
in classRun<P extends AbstractProject<P,R>,R extends AbstractBuild<P,R>>
- See Also:
LazyBuildMixIn.RunMixIn.dropLinks()
-
getPreviousBuild
public R getPreviousBuild()
- Overrides:
getPreviousBuild
in classRun<P extends AbstractProject<P,R>,R extends AbstractBuild<P,R>>
- See Also:
LazyBuildMixIn.RunMixIn.getPreviousBuild()
-
getNextBuild
public R getNextBuild()
- Overrides:
getNextBuild
in classRun<P extends AbstractProject<P,R>,R extends AbstractBuild<P,R>>
- See Also:
LazyBuildMixIn.RunMixIn.getNextBuild()
-
getBuiltOn
@CheckForNull public Node getBuiltOn()
Returns aSlave
on which this build was done.- Returns:
- null, for example if the agent that this build run no longer exists.
-
getBuiltOnStr
@Exported(name="builtOn") public String getBuiltOnStr()
Returns the name of the agent it was built on; null or "" if built by the built-in node. (null happens when we read old record that didn't have this information.)
-
setBuiltOnStr
protected void setBuiltOnStr(String builtOn)
Allows subtypes to set the value ofbuiltOn
. This is used for those implementations where anAbstractBuild
is made 'built' without actually running itsrun()
method.- Since:
- 1.429
-
getRootBuild
public AbstractBuild<?,?> getRootBuild()
Gets the nearest ancestorAbstractBuild
that belongs to the root project of getProject() that dominates/governs/encompasses this build.Some projects (such as matrix projects, Maven projects, or promotion processes) form a tree of jobs, and still in some of them, builds of child projects are related/tied to that of the parent project. In such a case, this method returns the governing build.
- Returns:
- never null. In the worst case the build dominates itself.
- Since:
- 1.421
- See Also:
AbstractProject.getRootProject()
-
getParentExecutable
public Queue.Executable getParentExecutable()
Description copied from interface:Queue.Executable
An umbrella executable (such as aRun
) of which this is one part. Some invariants:getParent().getOwnerTask() == getParent() || getParentExecutable().getParent() == getParent().getOwnerTask()
getParent().getOwnerExecutable() == null || getParentExecutable() == getParent().getOwnerExecutable()
- Specified by:
getParentExecutable
in interfaceQueue.Executable
- Returns:
- a distinct executable (never
this
, unlike the default ofSubTask.getOwnerTask()
!); or null if this executable was already at top level - See Also:
SubTask.getOwnerExecutable()
-
getUpUrl
@Deprecated(since="2.364") public String getUpUrl()
Deprecated.navigation through a hierarchy should be done through breadcrumbs, do not add a link using this methodUsed to render the side panel "Back to project" link.In a rare situation where a build can be reached from multiple paths, returning different URLs from this method based on situations might be desirable.
If you override this method, you'll most likely also want to override
Run.getDisplayName()
.
-
getWorkspace
@CheckForNull public final FilePath getWorkspace()
Gets the directory where this build is being built.Note to implementors: to control where the workspace is created, override
AbstractBuild.AbstractBuildExecution.decideWorkspace(Node,WorkspaceList)
.- Returns:
- null if the workspace is on an agent that's not connected. Note that once the build is completed, the workspace may be used to build something else, so the value returned from this method may no longer show a workspace as it was used for this build.
- Since:
- 1.319
-
setWorkspace
protected void setWorkspace(@NonNull FilePath ws)
Normally, a workspace is assigned byRun.RunExecution
, but this lets you set the workspace in caseAbstractBuild
is created without a build.
-
getModuleRoot
public final FilePath getModuleRoot()
Returns the root directory of the checked-out module.This is usually where
pom.xml
,build.xml
and so on exists.
-
getModuleRoots
public FilePath[] getModuleRoots()
Returns the root directories of all checked-out modules.Some SCMs support checking out multiple modules into the same workspace. In these cases, the returned array will have a length greater than one.
- Returns:
- The roots of all modules checked out from the SCM.
-
getCulpritIds
@CheckForNull public Set<String> getCulpritIds()
Description copied from interface:RunWithSCM
Gets the ids for allUser
s included inRunWithSCM.getChangeSets()
for this item.- Specified by:
getCulpritIds
in interfaceRunWithSCM<P extends AbstractProject<P,R>,R extends AbstractBuild<P,R>>
- Returns:
- A set of user IDs, or null if this was the first time the method was called or the build is still running
for a
RunWithSCM
instance with no culprits.
-
getCulprits
@Exported @NonNull public Set<User> getCulprits()
Description copied from interface:RunWithSCM
List of users who committed a change since the last non-broken build till now.This list at least always include people who made changes in this build, but if the previous build was a failure it also includes the culprit list from there.
Missing
User
s will be created on-demand.- Specified by:
getCulprits
in interfaceRunWithSCM<P extends AbstractProject<P,R>,R extends AbstractBuild<P,R>>
- Returns:
- can be empty but never null.
-
shouldCalculateCulprits
public boolean shouldCalculateCulprits()
Description copied from interface:RunWithSCM
Determines whether culprits should be recalcuated or the existingRunWithSCM.getCulpritIds()
should be used instead.- Specified by:
shouldCalculateCulprits
in interfaceRunWithSCM<P extends AbstractProject<P,R>,R extends AbstractBuild<P,R>>
- Returns:
- True if culprits should be recalcuated, false otherwise.
-
calculateCulprits
@NonNull public Set<User> calculateCulprits()
Description copied from interface:RunWithSCM
Method used for actually calculating the culprits from scratch. Called byRunWithSCM.getCulprits()
and overrides ofRunWithSCM.getCulprits()
. Does not persist culprits information.- Specified by:
calculateCulprits
in interfaceRunWithSCM<P extends AbstractProject<P,R>,R extends AbstractBuild<P,R>>
- Returns:
- a non-null
Set
ofUser
s associated with this item.
-
getHudsonVersion
public String getHudsonVersion()
Gets the version of Hudson that was used to build this job.- Since:
- 1.246
-
getChangeSet
@Exported @NonNull public ChangeLogSet<? extends ChangeLogSet.Entry> getChangeSet()
Gets the changes incorporated into this build.- Returns:
- never null.
-
getChangeSets
@NonNull public List<ChangeLogSet<? extends ChangeLogSet.Entry>> getChangeSets()
Description copied from interface:RunWithSCM
Gets allChangeLogSet
s currently associated with this item.- Specified by:
getChangeSets
in interfaceRunWithSCM<P extends AbstractProject<P,R>,R extends AbstractBuild<P,R>>
- Returns:
- A possibly empty list of
ChangeLogSet
s.
-
hasChangeSetComputed
public boolean hasChangeSetComputed()
Returns true if the changelog is already computed.
-
getEnvironment
@NonNull public EnvVars getEnvironment(@NonNull TaskListener log) throws IOException, InterruptedException
Description copied from class:Run
Returns the map that contains environmental variables to be used for launching processes for this build.BuildStep
s that invoke external processes should use this. This allowsBuildWrapper
s and other project configurations (such as JDK selection) to take effect.Unlike earlier
Run.getEnvVars()
, this map contains the whole environment, not just the overrides, so one can introspect values to change its behavior.- Overrides:
getEnvironment
in classRun<P extends AbstractProject<P,R>,R extends AbstractBuild<P,R>>
- Returns:
- the map with the environmental variables.
- Throws:
IOException
InterruptedException
-
getEnvironments
public EnvironmentList getEnvironments()
During the build, expose the environments contributed byBuildWrapper
s and others.Since 1.444, executor thread that's doing the build can access mutable underlying list, which allows the caller to add/remove environments. The recommended way of adding environment is through
BuildWrapper
, but this might be handy for build steps who wants to expose additional environment variables to the rest of the build.- Returns:
- can be empty list, but never null. Immutable.
- Since:
- 1.437
-
due
public Calendar due()
-
addAction
public void addAction(@NonNull Action a)
Adds a new action. Note: calls toActionable.getAllActions()
that happen before calls to this method may not see the update. Note: this method will always modify the actions ARunAction2
is handled specially. The action may have asummary.jelly
view containing a<t:summary>
or other<tr>
.- Overrides:
addAction
in classRun<P extends AbstractProject<P,R>,R extends AbstractBuild<P,R>>
-
getSensitiveBuildVariables
public Set<String> getSensitiveBuildVariables()
Builds up a set of variable names that contain sensitive values that should not be exposed. The expectation is that this set is populated with keys returned bygetBuildVariables()
that should have their values masked for display purposes.- Since:
- 1.378
-
getBuildVariables
public Map<String,String> getBuildVariables()
Provides additional variables and their values toBuilder
s.This mechanism is used by
MatrixConfiguration
to pass the configuration values to the current build. It is up toBuilder
s to decide whether they want to recognize the values or how to use them.This also includes build parameters if a build is parameterized.
- Returns:
- The returned map is mutable so that subtypes can put more values.
-
getBuildVariableResolver
public final VariableResolver<String> getBuildVariableResolver()
CreatesVariableResolver
backed bygetBuildVariables()
.
-
getTestResultAction
@Deprecated public Action getTestResultAction()
Deprecated.UseActionable.getAction(Class)
onAbstractTestResultAction
.
-
getAggregatedTestResultAction
@Deprecated public Action getAggregatedTestResultAction()
Deprecated.UseActionable.getAction(Class)
onAggregatedTestResultAction
.
-
run
public abstract void run()
Invoked byExecutor
to performs a build.- Specified by:
run
in interfaceQueue.Executable
- Specified by:
run
in interfaceRunnable
-
getWhyKeepLog
public String getWhyKeepLog()
Description copied from class:Run
IfRun.isKeepLog()
returns true, returns a short, human-readable sentence that explains why it's being kept.- Overrides:
getWhyKeepLog
in classRun<P extends AbstractProject<P,R>,R extends AbstractBuild<P,R>>
-
getDownstreamRelationship
public Fingerprint.RangeSet getDownstreamRelationship(AbstractProject that)
Gets the dependency relationship from this build (as the source) and that project (as the sink.)- Returns:
- range of build numbers that represent which downstream builds are using this build.
The range will be empty if no build of that project matches this (or there is no
Fingerprinter.FingerprintAction
), but it'll never be null.
-
getDownstreamBuilds
public Iterable<AbstractBuild<?,?>> getDownstreamBuilds(AbstractProject<?,?> that)
Works likegetDownstreamRelationship(AbstractProject)
but returns the actual build objects, in ascending order.- Since:
- 1.150
-
getUpstreamRelationship
public int getUpstreamRelationship(AbstractProject that)
Gets the dependency relationship from this build (as the sink) and that project (as the source.)- Returns:
- Build number of the upstream build that feed into this build,
or -1 if no record is available (for example if there is no
Fingerprinter.FingerprintAction
, even if there is anCause.UpstreamCause
).
-
getUpstreamRelationshipBuild
public AbstractBuild<?,?> getUpstreamRelationshipBuild(AbstractProject<?,?> that)
Works likegetUpstreamRelationship(AbstractProject)
but returns the actual build object.- Returns:
- null if no such upstream build was found, or it was found but the build record is already lost.
-
getDownstreamBuilds
public Map<AbstractProject,Fingerprint.RangeSet> getDownstreamBuilds()
Gets the downstream builds of this build, which are the builds of the downstream projects that use artifacts of this build.- Returns:
- For each project with fingerprinting enabled, returns the range
of builds (which can be empty if no build uses the artifact from this build or downstream is not
AbstractProject.isFingerprintConfigured()
.)
-
getUpstreamBuilds
public Map<AbstractProject,Integer> getUpstreamBuilds()
Gets the upstream builds of this build, which are the builds of the upstream projects whose artifacts feed into this build.- Returns:
- empty if there is no
Fingerprinter.FingerprintAction
(even if there is anCause.UpstreamCause
) - See Also:
getTransitiveUpstreamBuilds()
-
getTransitiveUpstreamBuilds
public Map<AbstractProject,Integer> getTransitiveUpstreamBuilds()
Works likegetUpstreamBuilds()
but also includes all the transitive dependencies as well.
-
getDependencyChanges
public Map<AbstractProject,AbstractBuild.DependencyChange> getDependencyChanges(AbstractBuild from)
Gets the changes in the dependency between the given build and this build.- Returns:
- empty if there is no
Fingerprinter.FingerprintAction
-
doStop
@Deprecated public void doStop(org.kohsuke.stapler.StaplerRequest req, org.kohsuke.stapler.StaplerResponse rsp) throws IOException, javax.servlet.ServletException
Deprecated.as of 1.489 UsedoStop()
- Throws:
IOException
javax.servlet.ServletException
-
doStop
public org.kohsuke.stapler.HttpResponse doStop() throws IOException, javax.servlet.ServletException
Stops this build if it's still going. If we use this/executor/stop URL, it causes 404 if the build is already killed, asRun.getExecutor()
returns null.- Throws:
IOException
javax.servlet.ServletException
- Since:
- 1.489
-
-